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); }