反射实际上就是为得到程序集中的属性和方法。今晚并制作测试程序与大家分享,也请批评指正
程序集SomeSports.dll的源文件如下所示。 using System; public class Football : Sport { public Football() { name = "Football"; } public override string GetDuration() { return "four 15 minute quarters"; } public override string GetName() { return name; } } public class Hockey : Sport { public Hockey() { name = "Hockey"; } public override string GetDuration() { return "three 20 minute periods"; } public override string GetName() { return name; } } public class Soccer : Sport { public Soccer() { name = "Soccer"; } public override string GetDuration() { return "two 45 minute halves"; } public override string GetName() { return name; } } 上述代码中的父类Sport代码如下所示。 using System; public abstract class Sport { protected string name; public abstract string GetDuration(); public abstract string GetName(); } 在生成程序集SomeSport.dll后,反过来想知道这个程序集中有哪些类,以及想知道如何调用程序集中某类对象的方法时,大致步骤如下。 1. 导入using System.Reflection; 2. Assembly.Load("程序集")加载程序集,返回类型是一个Assembly 3. foreach (Type type in assembly.GetTypes()) { string t = type.Name; } 得到程序集中所有类的名称 4. Type type = assembly.GetType("程序集.类名");获取当前类的类型 5. Activator.CreateInstance(type); 创建此类型实例 6. MethodInfo mInfo = type.GetMethod("方法名");获取当前方法 7. mInfo.Invoke(null,方法参数); 根据上述步骤,制作测试代码如下所示。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { Assembly assembly1 = Assembly.LoadFrom("SomeSports.dll"); string t = ""; foreach (Type type1 in assembly1.GetTypes()) { t = type1.Name; Console.WriteLine(t); } if (t != null) { Type type = assembly1.GetType(t);//获取当前类的类型 Object dynamicObject = Activator.CreateInstance(type); //创建此类型实例 MethodInfo mInfo = type.GetMethod("GetDuration");//获取当前方法 string s = (string)mInfo.Invoke(dynamicObject, null); Console.WriteLine(s); } Console.ReadKey(); } } } |