反射

1、假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型):

Assembly assembly = Assembly.LoadFile("程序集路径,不能是相对路径"); // 加载程序集(EXE 或 DLL) 
dynamic obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)"); // 创建类的实例 

2、若要反射当前项目中的类(即当前项目已经引用它了)可以为:

Assembly assembly = Assembly.GetExecutingAssembly(); // 获取当前程序集 
dynamic obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)"); // 创建类的实例,返回为 object 类型,需要强制类型转换

3、也可以为:

Type type = Type.GetType("类的完全限定名"); 
dynamic obj = type.Assembly.CreateInstance(type); 

4、不同程序集的话,则要装载调用,代码如下:

System.Reflection.Assembly.Load("程序集名称(不含文件后缀名)").CreateInstance("命名空间.类名", false);
如:
dynamic o = System.Reflection.Assembly.Load("MyDll").CreateInstance("MyNameSpace.A", false);

5、创建的对象没有公有public的构造函数

System.Reflection.BindingFlags flags = System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance;
System.Globalization.CultureInfo culture = null;
System.Reflection.Assembly assembly = System.Reflection.Assembly.Load("程序集名称(不含文件后缀名)");
Type type = assembly.GetType("命名空间.类名");
Object o = Activator.CreateInstance(type, flags, null, new object[] { 传参1,传参2,等等}, culture);

6、使用反射根据一个字典(key为属性名,value为属性值)设置类,返回一个对象

        /// <summary>
        /// 遍历返回一个Public、Instance、NonPublic属性都赋值好的类
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dict">key为T类型的属性名,value为对应key的值</param>
        /// <returns></returns>
        private T GetObject<T>(IDictionary<string, object> dict)
        {
            Type type = typeof(T);
            var obj = Activator.CreateInstance(type);

            foreach (var kv in dict)
            {
                //反射,默认是只能找到public属性,非public属性不会被找到,所以要传入BindingFlags参数来获取protected属性
                //先GetProperty根据dict的key找到属性对象,再SetValue这个obj的这个属性值赋值为dict的Value
                type.GetProperty(kv.Key, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(obj, kv.Value);
            }
            return (T)obj;
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值