具有通用对象的集合

Vla*_*ani 5 c# oop collections

有一种方法可以将基础对象列表作为参数.

abstract class Base {}
class MyClass:Base {}
//...
void Method(List<Base> list) {}
Run Code Online (Sandbox Code Playgroud)

当我调用该方法时,我想传递派生对象的列表.

var derivedList = new List<MyClass>();
Method(derivedList);
Run Code Online (Sandbox Code Playgroud)

但我无法做到这一点,因为派生的集合与基础对象的集合不同.处理这种情况的最佳做法是什么?现在我正在使用我的扩展.ToBase(),我创建了新的集合,但我认为有更好的解决方案.

谢谢.

Kla*_*sen 11

制作你的Method通用:

public void Method<T>(List<T> list) where T : Base
{
    //Do your stuff
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 6

如果该方法只读取的值,它可以被声明为:

void Method(IEnumerable<Base> list)
Run Code Online (Sandbox Code Playgroud)

这样,您的调用代码在C#4/.NET 4中可以正常工作而无需任何更改.在.NET 3.5中,您可以使用

Method(derivedList.Cast<Base>());
Run Code Online (Sandbox Code Playgroud)

如果您的方法是在列表中添加值,那么通用协方差将不会也不应该起作用.毕竟,你不希望引用某个其他类派生的实例Base添加到你的List<MyClass>,你呢?

制作Method通用(如Klaus所建议)也可以在各种情况下工作,但也可以使代码更复杂.如果不知道你的方法做什么,很难说这是否是一个好方法......尽管这绝对值得尝试.