3

我有一个基本类型 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 */ }

我希望我的每个子函数 F1、F2、F3 调用 Base 函数,例如

public void F1(List<C1> L1)
{
     Fn(L1);  // this is the line that fails
}

我试过重铸为基本类型,B

Fn( (List<B>)L1 );

但是,我收到一条错误消息,说即使 C1 是从 B 派生的,我也无法将类型“System.Collections.Generic.List”转换为“System.Collections.Generic.List”。

我还尝试在 Fn 名称中添加类型:

Fn<C1>( L1 );

Fn<C1>(  (List<B>)L1 );

我发现建议说我应该将我的子列表转换为基类列表(这对我来说失败)并在我的通用函数 Fn 中检查我传递的列表是否属于特定类型,然后执行特定于该类型的单独代码类型。除了推荐的铸造对我不起作用之外,这似乎破坏了 OOP 的多态性,在泛型函数中仍然有子类特定的代码。

我希望存在一些真正的抽象/通用方法来不重复代码,从而将我的子列表视为基本列表。

谁能告诉我如何做到这一点?

谢谢你。

4

2 回答 2

7

首先阅读这篇文章: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 */ }
于 2013-05-26T21:46:59.397 回答
0

使用IList而不是List. 检查协方差和逆变

于 2013-05-26T21:45:48.977 回答