首页 新闻 赞助 找找看

泛型协变与逆变在反射工厂中如何应用?

0
悬赏园豆:100 [已解决问题] 解决于 2016-05-24 16:27

我有这样一个业务,需要定义一个泛型业务接口(IRule<T>)和一个实体接口IEntity,因为有多种业务,所以每个业务类都会实现业务接口IRule<T>.我希望通过一个工厂(Factory<T>),可以动态创建实现了业务接口的泛型实现类,并作为泛型接口类型返回.类图如下:

我在实现过程中,已经可以通过反射工厂正确创建业务实现类,但在实现类转换成泛型接口时会报错,我在网上查了一下,可能是泛型的协变与逆变问题,求高手指点,感激不尽!

编码半辈子的主页 编码半辈子 | 初学一级 | 园豆:34
提问于:2016-05-24 10:23
< >
分享
最佳答案
0

已经解决.

编码半辈子 | 初学一级 |园豆:34 | 2016-05-24 16:25

很么情况?

小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2016-05-24 17:18

@小眼睛老鼠: 通过Type创建泛型对象时,需要传入类型参数集constructed,否则无法转换

编码半辈子 | 园豆:34 (初学一级) | 2016-05-24 20:47
其他回答(2)
0

实现类转换成泛型接口

这就有点扯了 这里好像既不是 协变也不是逆变

要能转的前提是 至少这个你要转的类是继承的父子关系

 

按你的说法 好像不是父子关系

小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2016-05-24 14:49

您看一下类图中,是继承关系,请问你有什么解决方案吗?

支持(0) 反对(0) 编码半辈子 | 园豆:34 (初学一级) | 2016-05-24 15:29

@杨璞: 你报错的是那一段?

支持(0) 反对(0) 小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2016-05-24 15:33
0
public static IRule<T> Create<T>(string name) where T : IEntity 
            {
                  var types = AppDomain.CurrentDomain.Load(name)
                        .GetTypes().Where(n => n.GetInterface(typeof(IRule<T>).Name) != null);
                       return Activator.CreateInstance(types.FirstOrDefault()) as IRule<T>;
            }

FYI

收获园豆:100
Yu | 园豆:12980 (专家六级) | 2016-05-24 15:12

高手,您好,非常感谢您的热心回答,但这段代码还是存在一点小问题,请看下图:

请不吝赐教!谢谢!

 

支持(0) 反对(0) 编码半辈子 | 园豆:34 (初学一级) | 2016-05-24 15:25

@杨璞: 上面写的很清楚了 无法创建zhilianzhaopin(智联招聘???)这个对象 因为构造器上有参数 但是你创建的时候 却没有参数

和逆变 协变 半毛钱关系都没有啊

支持(0) 反对(0) 小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2016-05-24 15:31

@小眼睛老鼠: 是的,智联招聘,我在写一个爬虫,爬他的数据,写完以后我将会公布出这个程序,以方便大家找到更适合自己的工作.当然是免费的

支持(0) 反对(0) 编码半辈子 | 园豆:34 (初学一级) | 2016-05-24 15:33

@小眼睛老鼠: 你有什么解决方案吗?

创建一个实现了泛型接口的类,然后以泛型接口的方式返回

支持(0) 反对(0) 编码半辈子 | 园豆:34 (初学一级) | 2016-05-24 15:36

其实在Activator.CreateInstance的时候创建的对象是正确的,但是转换成IResolveRule<T>的时候出错了.

支持(0) 反对(0) 编码半辈子 | 园豆:34 (初学一级) | 2016-05-24 15:38

@杨璞: 报错错是creat的时候就是错误的 并不是IResolveRule<T> 的时候报的错 

creat的时候 没有输入参数 但是又没有 没有参数的构造器

支持(0) 反对(0) 小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2016-05-24 15:58

支持(0) 反对(0) 编码半辈子 | 园豆:34 (初学一级) | 2016-05-24 15:59

@杨璞: 错误信息 ,obj的类型  以及 t的类型

支持(0) 反对(0) 小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2016-05-24 16:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册