首页 新闻 搜索 专区 学院

泛型、反射。如何用反射获取泛型类型。

0
悬赏园豆:5 [已解决问题] 解决于 2012-12-12 18:05

很简单,有这样一个泛型 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实例哦!

Gamain的主页 Gamain | 菜鸟二级 | 园豆:357
提问于:2012-11-28 10:23
< >
分享
最佳答案
0

没有添加这个 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 });

 

收获园豆:5
Qlin | 老鸟四级 |园豆:2403 | 2012-11-28 10:55

有点不太明吧,我直接说我的需求把

比如有一个根据Class创建实例的方法

IJobDetail job = JobBuilder.Create<DemoJob1>();

如果DemoJob1是在一个dll文件中,而且类名不确定(有可能是DemoJob2等)那么改如何写呢?

我的目的是要实现:

根据不同的 dll 来创建不同的实例。当然这些class都同样的接口约束。

Gamain | 园豆:357 (菜鸟二级) | 2012-11-28 12:43
其他回答(3)
0

报什么错?你确定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");

johnMing | 园豆:223 (菜鸟二级) | 2012-11-28 11:14
0

1.你通过Assembly.LoadFile(...dll...)加载过来的是一个程序集,包含有很多类,所以你判断这个程序集的类型是错误的。

2.通常情况下,我们利用动态反射机制去获取dll中的类和方法时都是要知道类和方法的具体名字的。

3.如你所说,你只知道你需要的类(DemoJob1,DemoJob2)都是实现了IDemoJob接口的,那么你只能去遍历你刚才取回来的程序中所有的类,if(this class is IDemoJob),那么在获取这个类的类型,接下来实现你的操作。

4.除非这些dll对你来说是封闭的,否则你没有必要从dll入手。

谢谢。

woocool | 园豆:190 (初学一级) | 2012-11-29 14:49
0

这些答案没什么用, 推荐看  如何:使用反射检查和实例化泛型类型

在风里 | 园豆:202 (菜鸟二级) | 2017-03-21 15:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册