【问题标题】:C# Pass to function a Child List as a Base ListC# 传递以将子列表用作基本列表
【发布时间】:2013-05-26 21:33:56
【问题描述】:

我有一个基本类型 B 和多个派生子类型,C1:B、C2:B、C3:B 等。

我有每个子类型的列表,ListL1、ListL2、ListL3。

对于每个子类型,我都有工作函数 F1、F2、F3,它们为该子类型获取相应的列表 L1、L2、L3,并完成基本相同的功能(仅处理 B 的属性),但对于对应的类型,C1,C2,C3。

我希望有一个基于基本类型列表的单个函数,“多态”列表执行独立于子类型的函数。

我知道我应该能够通过使用模板说明符固定我的函数声明来将列表传递到我的函数中,例如:

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 的多态性,在泛型函数中仍然有子类特定的代码。

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

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

谢谢。

【问题讨论】:

    标签: c# list polymorphism parameter-passing covariance


    【解决方案1】:

    先阅读这篇文章:http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx

    简而言之,即使C : BList&lt;C&gt; 不能被引用为List&lt;B&gt;但是 IEnumerable&lt;&gt; 可以(阅读以上文章了解原因)。

    那么你可以使用:

    public void Fn(IEnumerable<B> BList) { /* do stuff */ }
    

    【讨论】:

      【解决方案2】:

      使用IList 而不是List。检查Covariance and Contravariance

      【讨论】:

      • IList 仍然不是Covariant
      猜你喜欢
      • 1970-01-01
      • 2020-06-21
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多