我有一个IList
我想投的东西ICollection
但是当我尝试一个明确的演员时,我得到了null
.是否可以在不创建和填充新集合的情况下执行此操作?
编辑: 由于我只想从集合中读取,我转而使用泛型方法:
public void PopulateList(ICollection collection)
然后我可以通过它IList
.有没有一种很好的方法来缓存此列表,以便我可以在需要时刷新它.我的第一个倾向是使用:
Object cachedCollection; Type cachedType; public void PopulateList(ICollection collection) { cachedCollection = collection; cachedType = T; // other stuff... } private void Refresh() { PopulateList (cachedCollection as ICollection ); }
有没有人有更好的方法这样做?
最简洁的答案是不." 您需要使用新的BaseClass类型创建一个新集合并填充它.
如果你考虑一下,这是有道理的.如果您可以简单地将您的集合"强制转换"为BaseClass,那么您可以将类型为"BaseClass"的东西粘贴到其中,从而将简单的BaseClass对象强制转换为DerivedClass集合.这将破坏创建类型安全集合的目的.
在极端情况下,如果您有两个派生类Foo和Bar,则可以通过将集合类型转换回BaseClass集合来强制Bar对象进入Foo对象的集合.
这被称为协方差,虽然目前在.net中不支持泛型,但它将被添加到4.0框架中(以及相反的方向,即反向差异).
来自PDC 2008的精彩视频是由Anders Hejlsberg提供的关于C#期货的会议:
http://channel9.msdn.com/pdc2008/TL16/