c# – 使用泛型问题并使用运行时类型而不是(通用)T
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用泛型问题并使用运行时类型而不是(通用)T,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1717字,纯文字阅读大概需要3分钟。
内容图文
![c# – 使用泛型问题并使用运行时类型而不是(通用)T](/upload/InfoBanner/zyjiaocheng/800/d253118a401f4937bd26b16e75e70d1f.jpg)
为了尽可能容易地解决问题,我试图实现一个通用池系统,只要它们实现IBaseComponent就可以处理任意数量的具体类.
所以,在我管理池的类中,我有一个Pool of Dictionarys:
Dictionary<Type, Pool<IBaseComponent>> pools;
因为这将允许我创建尽可能多的实现IBaseComponent的类(这是一个非常“低级别”的接口,所以可以这么说 – 所以实现它的类不会兼容得太多),并且可以有每个人都有一个游泳池
现在,我正在运行的问题是第一次将IBaseComponent加载到池中,充当模板,可以这么说.
这个模板对象是从XML而不是代码加载的,所以我在编译时没有它的实际类,只在运行时(它在XML定义中定义,我通过反射获取正式的Type).这一切都很好,但是,正如我们所知,泛型依赖于编译时的安全性.
所以,使用一些反思技巧,我有以下内容:
var type = typeof(MyChildComponent);
var genericType = typeof(Pool<>);
var specificType = genericType.MakeGenericType(type);
var pool = Activator.CreateInstance(specificType );
pools.Add(T, pool as Pool<IBaseComponent>);
假设一些课:
public class MyChildComponent : IBaseComponent
当我添加到池字典时,问题出现在第一个块的最后一行.将实例化池转换为Pool< IBaseComponent>失败,导致null被插入到Dictionary中.
我对你这些好人的问题是:有什么合理的方法吗?任何可能的方式,甚至?
如果我需要通过一些外部方法(XML,TXT,无论如何)为至少池的第一个模板对象加载元素,对于可以使用Pool的每个可能的具体类,我可以访问的是顶级接口和正式类的类型(都在外部定义文件中定义),我可以在这做任何事情吗?
或者根本不可能这样做?
解决方法:
你在使用.Net 4吗?如果是这样,您可以创建一个接口IPool< out T>. out使得泛型参数协变,这意味着它将接受任何版本的接口,其泛型参数为T或从T派生.
由于某种原因,协同/反演只适用于接口和委托,这就是你需要IPool的原因.
你的词典将成为:
Dictionary<Type, IPool<IBaseComponent>>() pools;
我把它与我的头脑中的反射结合起来有点麻烦,但我认为这应该有效.如果没有,请告诉我,我会花更多时间在我的测试代码上.
内容总结
以上是互联网集市为您收集整理的c# – 使用泛型问题并使用运行时类型而不是(通用)T全部内容,希望文章能够帮你解决c# – 使用泛型问题并使用运行时类型而不是(通用)T所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。