【问题标题】:Convert List of objects to List of interfaces将对象列表转换为接口列表
【发布时间】:2011-01-01 03:30:01
【问题描述】:

如果我有实现 ISomeInterface 的 objectA

为什么我不能这样做:

List<objectA> list = (some list of objectAs . . .)

List<ISomeInterface> interfaceList = new List<ISomeInterface>(list);

为什么我不能将列表粘贴到 interfaceList 构造函数中?有什么解决办法吗?

【问题讨论】:

    标签: c# .net .net-3.5


    【解决方案1】:

    这是在 C# 4.0 中处理的,您不能直接在 C# 3.5 中执行此操作。但是,您可以从此列表中创建一个新列表,并使用扩展运算符或 foreach 干净地完成它,尽管比转换为由 covariance 逆变提供的类型要慢(总是弄错这些)在 C# 4 中。

    【讨论】:

    • 查看我对 Jared 的评论 - 没有 C# 3.5 这样的东西。
    • Arg,让我想起了 Futurama 中的 beauracrat。虽然说 Linq 是一种语言变化,并且直到 C# 3.5 才引入,所以 C# 在 linq 扩展之前是 2.0,但 WCF 只是 3.0 中的框架升级。
    • @JonSkeet 现在,大约 10 年了。
    • @Bitterblue:不,真的没有。有 .NET 3.5,但没有 C# 3.5 这样的东西。如果您可以举一个您认为在 C# 3.5 中引入的功能的示例,我将向您展示它引入的实际版本。
    • 我注意到我之前没有回复过@Spence... LINQ 是在 C# 3 中引入的,它是随 .NET 3.5 一起提供的。下载the C# 3.0 spec 亲自查看。我认为区分框架和语言版本号并不是特别官僚——这有助于使 IMO 的沟通更加清晰。
    【解决方案2】:

    在 C# 3.0 + .Net 3.5 及更高版本中,您可以通过执行以下操作来解决此问题

    List<ISomeInterface> interfaceList = new List<ISomeInterface>(list.Cast<ISomeInterface>());
    

    这不起作用的原因是List&lt;ISomeInterface&gt; 在这种情况下的构造函数采用IEnumerable&lt;ISomeInterface&gt;。列表变量的类型虽然只能转换为IEnumerable&lt;objectA&gt;。即使objectA 可以转换为ISomeInterfaceIEnumerable&lt;objectA&gt; 类型也不能转换为IEnumerable&lt;ISomeInterface&gt;

    这在 C# 4.0 中发生了变化,它为语言添加了 Co 和逆变器支持并允许进行此类转换。

    【讨论】:

    • @itowlson,这就是用户在示例中所做的事情。他们没有指定 Add 行为是所需解决方案的一部分。
    • 您的意思是 .NET 3.5,而不是 C# 3.5。
    【解决方案3】:

    最简单的方法是:

    var interfaceList = list.Cast<ISomeInterface>().ToList()
    

    List<ISomeInterface> interfaceList = list.Cast<ISomeInterface>().ToList()
    

    以上两个示例代码是相同的,你可以使用每个你想要的......

    【讨论】:

    • 右侧使用 ToList() 是个好主意!但请注意,使用 var 会隐藏变量的真实类型,这样做不是一个好习惯。 List interfaceList = list.Cast().ToList();所以我就用这个表格作为最清晰、最短的版本
    • @KovácsEde,根据你提到的观点,我在这个答案中添加了我的第二种格式,但它们都是平等的。当我们使用var 时,实际上我们正在以更短的格式编写代码,并且总是可以通过查看= 的右侧来识别变量的类型。另一方面,即使我们使用varC# 编译器也足以识别变量的真实类型。因此,如果您想要更短的语法,请使用var 并从= 右侧的代码中识别变量类型,否则您可以使用第二种格式。
    猜你喜欢
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    相关资源
    最近更新 更多