很简单,有这样一个泛型 List<T>
如果我的 T 想从Dll文件里面获取,即 T 是不可知的 ,那么该如何写呢?
我这样写
Assembly assembly = Assembly.LoadFile(@"E:\Workspace\QSMC.JobManager\ServiceTest\bin\Debug\DemoJob1.dll");
Type type = assembly.GetTypes()[1];
List<type> list=new List<type>();
结果报错,很显然 这个 T 不是 Type 类型的,应该是一个class
那么该如果和重一个dll中获取 一个Class呢?
注意 是一个 Class,而不是一个Class实例哦!
没有添加这个 dll的引用,就不能直接 List<T>,这个T无法引用到,利用反射创建实例和调用方法。
Assembly assembly = Assembly.LoadFile(@"E:\Workspace\QSMC.JobManager\ServiceTest\bin\Debug\DemoJob1.dll"); Type type = assembly.GetTypes()[1]; var instance1 = Activator.CreateInstance(type); Type listType = typeof(List<>).MakeGenericType(type); //不知道T,如果知道T, 就 List<T> list=(List<T>)List; var List = Activator.CreateInstance(listType); listType.GetMethod("Add").Invoke(List, new object[] { instance1 });
有点不太明吧,我直接说我的需求把
比如有一个根据Class创建实例的方法
IJobDetail job = JobBuilder.Create<DemoJob1>();
如果DemoJob1是在一个dll文件中,而且类名不确定(有可能是DemoJob2等)那么改如何写呢?
我的目的是要实现:
根据不同的 dll 来创建不同的实例。当然这些class都同样的接口约束。
报什么错?你确定assembly.GetTypes()[1]不是NULL吗?
你只要var type = typeof(List<>); 就可以知道你那个库的类型了。
比如framework的List<T>就可以这样:
Assembly assembly = Assembly.LoadFile(@"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client\mscorlib.dll");
var type = assembly.GetType("System.Collections.Generic.List`1");
1.你通过Assembly.LoadFile(...dll...)加载过来的是一个程序集,包含有很多类,所以你判断这个程序集的类型是错误的。
2.通常情况下,我们利用动态反射机制去获取dll中的类和方法时都是要知道类和方法的具体名字的。
3.如你所说,你只知道你需要的类(DemoJob1,DemoJob2)都是实现了IDemoJob接口的,那么你只能去遍历你刚才取回来的程序中所有的类,if(this class is IDemoJob),那么在获取这个类的类型,接下来实现你的操作。
4.除非这些dll对你来说是封闭的,否则你没有必要从dll入手。
谢谢。