use*_*426 3 c# polymorphism list parameter-passing covariance
我有一个基本类型B和多个派生子类型,C1:B,C2:B,C3:B等.
我有每个子类型列表,ListL1,ListL2,ListL3.
我有每个子类型的工作函数F1,F2,F3,它们为该子项获取相应的列表L1,L2,L3,并完成基本上相同的功能(仅处理B的属性)但对于相应的类型,C1,C2,C3.
我希望有一个单一的函数,基于一个基类型列表,List"多态"执行子类型的函数独立.
我知道我应该能够通过使用模板说明符修复我的函数声明来将列表传递给我的函数,例如:
public void Fn<T>(List<T> BList) { /* do stuff */ }
Run Code Online (Sandbox Code Playgroud)
我希望我的每个子函数F1,F2,F3都可以调用Base函数
public void F1(List<C1> L1)
{
Fn(L1); // this is the line that fails
}
Run Code Online (Sandbox Code Playgroud)
我尝试过重铸作为基本类型,B
Fn( (List<B>)L1 );
Run Code Online (Sandbox Code Playgroud)
但是,我收到一个错误,说我无法将类型'System.Collections.Generic.List'转换为'System.Collections.Generic.List',即使C1是从B派生的.
我也试过在Fn名称中输入类型:
Fn<C1>( L1 );
Fn<C1>( (List<B>)L1 );
Run Code Online (Sandbox Code Playgroud)
我发现建议说我应该将我的子列表作为基类列表(对我来说失败),并在我的泛型函数Fn中,检查我传递的列表是否属于特定类型,然后执行特定于此的单独代码类型.除了推荐不适合我的演员之外,这似乎打败了OOP的多态性,仍然在泛型函数中具有子类特定代码.
我希望存在一些真正的抽象/通用方法,不再重复代码,从而将我的子列表视为基本列表.
任何人都可以告诉我如何做到这一点?
谢谢.
首先阅读本文:http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx
总之,即使C : B
,List<C>
也不能被引用List<B>
,但 IEnumerable<>
可以(阅读上面的文章来理解为什么).
然后你可以使用:
public void Fn(IEnumerable<B> BList) { /* do stuff */ }
Run Code Online (Sandbox Code Playgroud)