反射主要是用来获取类型和程序集的信息,在System.Reflection命名空间,通常是在System命名空间下的Type类一起使用;
获取程序集信息(Assembly)控制程序集,通过属性和方法可以获取程序集元数据信息,在获取元数据之前,需要先用Assembly类的Load方法(或LoadFile()、LoadFrom())将程序集加载到内存中;Assembly是抽象类只能通过方法、字段等的返回值来声明对象, 就是通过load方法返回值来声明Assembly的对象,加载程序集,Loading是在
Assembly a = Assembly.Load("MyReflection");
除此之外可以利用GetType和Typeof来获取程序集中的类型,它们返回到都是Type的对象
Type t = a.GetType("MyReflection." + PersonName);
在调用的类的方法是时候,必须要创建类的实例,两种方法获取类的实例返回object类型
方法一:通过Activator.CreateInstance() object obj = Activator.CreateInstance(t);
//方法二:通过实例的方法来返回object object obj = a.CreateInstance("MyReflection." + PersonName);
如果没有定义抽象类和接口时用MethodInfo类的Invoke方法来执行程序集中类的实例方法,下面执行类中say方法
MethodInfo mi = t.GetMethod("Say");、 mi.Invoke(obj, null);
下面来完成简单的反射动态获取程序集的信息以及类型方法的执行,这里定义程序集MyReflection,任意输入程序集中的类型,来执行指定类型的方法
namespace MyReflection { class Program { static void Main(string[] args) { string PersonName = Console.ReadLine(); Assembly a = Assembly.Load("MyReflection"); Type t = a.GetType("MyReflection." + PersonName); object obj = Activator.CreateInstance(t); MethodInfo mi = t.GetMethod("Say"); mi.Invoke(obj, null); } abstract class Person { public abstract void Say(); } class Chinese : Person //继承 { public override void Say() { } } class Han : Chinese { public override void Say() { Console.WriteLine("this is Han Say()!"); } public void HanSay() { } } class DaiZu : Chinese { public override void Say() { Console.WriteLine("this is DaiZu Say()!"); } } class English : Person { public override void Say() { Console.WriteLine("this is English Say()!"); } } }