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)
如果该方法只读取的值,它可以被声明为:
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所建议)也可以在各种情况下工作,但也可以使代码更复杂.如果不知道你的方法做什么,很难说这是否是一个好方法......尽管这绝对值得尝试.
| 归档时间: |
|
| 查看次数: |
851 次 |
| 最近记录: |