程序集加载与反射笔记

            Assembly.Load    //加载程序集,会从GAC、应用程序基目录、私有路径子目录查找
            Assembly.LoadFrom    //从路径加载,首先会得到程序集,然后内部调用Assembly.Load
            Assembly.LoadFile    //可多次加载一个程序集到AppDomain中,此时CLR不会自动解析任何依赖性问题
            Assembly.ReflectionOnlyLoadFrom        //如果只想分析程序集的元数据,而不执行任何代码,那么这个方法再适合不过 了

            /*获取程序集中定义的类型*/
            assembly.GetExportedTypes        //获取有所公开导出的类型(程序集外部可见的类型,即是public类型)
                                            //返回值是System.Type数组
            Type.GetType        //接受一个String参数,首先会检查调用程序集,看它是否定义了指定名称的类型。如果找到就去MSCorLib.dll查找
            Type.ReflectionOnlyGetType //(仅反射)/type.GetNestedType/type.GetNestedTypes
            type.IsClass/IsPublic/IsAssignableFrom(...)

            /*构造类型的实例*/
            Activator.CreateInstance
            Activator.CreateInstanceFrom    //通过字符串来指定类型及程序集,会调用Assembly.LoadFrom加载程序集
                                            //返回值是ObjectHandle对象引用,需要调用ObjectHandle的Unwrap方法进行具体化
            AppDomain.CreateInstance/CreateInstanceAndUnwrap    //和Activator类方法类似,带Unwrap后缀方法帮我们简化操作
            AppDomain.CreateInstanceFrom/CreateInstanceFromAndUnwrap
            type.InvokeMember    //该方法查找与传递的实参相匹配的一个构造器,并构造类型
            System.Relection.ConstructorInfo实例方法Invoke
           var type = Type.GetType("ConsoleApplication1.ReflectTest");

            /*①创建实例*/
            var instance = (ReflectTest)null;
            instance = Activator.CreateInstance(type) as ReflectTest;
            instance = Activator.CreateInstanceFrom("ConsoleApplication1.exe", "ConsoleApplication1.ReflectTest").Unwrap() as ReflectTest;
            instance = AppDomain.CurrentDomain.CreateInstanceAndUnwrap("ConsoleApplication1", "ConsoleApplication1.ReflectTest") as ReflectTest;
            instance = type.InvokeMember(null, BindingFlags.CreateInstance, null, null, null) as ReflectTest;
            instance = type.GetConstructor(Type.EmptyTypes).Invoke(null) as ReflectTest;

            /*②调用成员*/
            var result = (object)null;
            //直接访问
            instance.Print("Hello World");
            //Type实例的InvokeMember方法【调用方法】
            type.InvokeMember("Print", BindingFlags.InvokeMethod, Type.DefaultBinder, instance, new object[] { "Hello World"});
            或者
            type.GetMethod("Print").Invoke(instance, new object[] { "Hello World2" });
            //Type实例的GetMember方法【调用属性】
            result = type.GetProperty("SomeMsg").GetValue(instance);
            或者
            result = type.GetProperty("SomeMsg").GetGetMethod().Invoke(instance, null);
            或者
            result = (type.GetMember("SomeMsg", MemberTypes.Property, BindingFlags.Public | BindingFlags.Instance)[0] as PropertyInfo).GetValue(instance);
            Console.WriteLine(result);
            //Type实例的GetField方法【调用私有字段】
            result = type.GetField("someMsg", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(instance);
            Console.WriteLine(result);

            /*反射获取Attribute值*/
            var prop = type.GetProperty("SomeMsg");
            var descType =  typeof(DescriptionAttribute);
            if (Attribute.IsDefined(prop, descType))
            {
                var attr = Attribute.GetCustomAttribute(prop, descType) as DescriptionAttribute;
                Console.WriteLine(attr.Description);
            }

转载于:https://www.cnblogs.com/rgshare/p/3274238.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值