有时候,为了快速批量处理已经实现某个基类或者某个接口的子类,需要通过反射的方式获取到他们的类类型(Type),然后再通过
Activator.CreateInstance(objType);或者
Assembly.Load(path).CreateInstance(typeName);或者
Assembly.LoadFile(filePath).CreateInstance(typeName);创建对象实例。
以下通过一个简单的示例来展示:1,获取当前程序集中的全部类型;2,判断某一类型是否是继承与另一类型;3,根据类型名动态创建对象。
目前还有个疑问,不知道谁能解答:1,如何判断某个类是否实现了某个接口,目前只能先 new 一个对象,然后再 用 is 判断。
using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Diagnostics; namespace com.hetaoos { class Test { public Test() { var types = Assembly.GetExecutingAssembly().GetTypes(); var baseType = typeof(BaseProcessor); List<BaseProcessor> processors = new List<BaseProcessor>(); foreach (var t in types) { var tmp = t.BaseType; while (tmp != null) { if (tmp == baseType) { BaseProcessor obj = MethodMaker.CreateObject(t.FullName) as BaseProcessor; if (obj != null) { processors.Add(obj); } break; } else { tmp = tmp.BaseType; } } } Debug.Print("Processor Count:{0}", processors.Count); foreach (var p in processors) { Debug.Print("{0}\t:{1}", p, p.Calc(2, 5)); } } } public class MethodMaker { /// <summary> /// 创建对象(当前程序集) /// </summary> /// <param name="typeName">类型名</param> /// <returns>创建的对象,失败返回 null</returns> public static object CreateObject(string typeName) { object obj = null; try { Type objType = Type.GetType(typeName, true); obj = Activator.CreateInstance(objType); } catch (Exception ex) { Debug.Write(ex); } return obj; } /// <summary> /// 创建对象(外部程序集) /// </summary> /// <param name="path"></param> /// <param name="typeName">类型名</param> /// <returns>创建的对象,失败返回 null</returns> public static object CreateObject(string path, string typeName) { object obj = null; try { obj = Assembly.Load(path).CreateInstance(typeName); } catch (Exception ex) { Debug.Write(ex); } return obj; } } public abstract class BaseProcessor { public abstract int Calc(int a, int b); } public class Adder : BaseProcessor { public override int Calc(int a, int b) { return a + b; } } public class Multiplier : BaseProcessor { public override int Calc(int a, int b) { return a * b; } } }输出结果为:
Processor Count:2 com.hetaoos.Adder :7 com.hetaoos.Multiplier :10PS:判断某个类是否继承自某个接口、类的方法:
public static bool IsParent(Type test, Type parent) { if (test == null || parent == null || test == parent || test.BaseType == null) { return false; } if (parent.IsInterface) { foreach (var t in test.GetInterfaces()) { if (t == parent) { return true; } } } else { do { if (test.BaseType == parent) { return true; } test = test.BaseType; } while (test != null); } return false; }
转载自:http://blog.hetaoos.com/archives/40
转载于:https://www.cnblogs.com/wuhenke/archive/2012/05/21/2512364.html
相关资源:数据结构—成绩单生成器