【问题标题】:Converting Between List Types in C#在 C# 中的列表类型之间转换
【发布时间】:2014-02-13 01:43:21
【问题描述】:

我有以下课程:

ClassA
ClassB
ClassC

然后全部继承自:

ParentClass

在我的代码中,我有一个名为 MyLists 的属性,它的类型为 Object,声明如下:

Object MyLists = null;  

它的值可以是以下任何一种:

List<ClassA>
List<ClassB>
List<ClassC>

我希望做类似的事情:

foreach(ParentClass o in MyLists)
    //yada yada

但不幸的是,这似乎是不可能的。我收到一个运行时错误说明:

Can't convert from List<ClassA> to List<ParentClass>

我不希望以这样的代码结束:

if(MyLists is List<ClassA>)
{
    // blah blah
}
else if(MyLists is List<ClassB>)
{
    // blah blah
}
:
:

如何将 MyLists 转换为 List?

谢谢

【问题讨论】:

标签: c# list generics type-conversion


【解决方案1】:

如果你只需要列举你可以做的值

foreach(var parent in (IEnumerable<ParentClass>)MyLists)
{
}

如果将MyLists 的类型更改为IEnumerable&lt;ParentClass&gt;,则可以避免强制转换。

【讨论】:

    【解决方案2】:

    替换

    Object MyLists = null;  
    

    有了这个

    IList<ParentClass> MyLists = null;
    

    像这样实例化MyLists

    MyLists = new List<ParentClass>();
    

    现在可以添加ParentClassClassA 等实例。

    【讨论】:

    • 它创建一个对实现 IList 的类的引用,因此您的 foreach 循环可以编译,您可以插入所有派生类的实例
    • 这不会编译,您不能将 List&lt;Child&gt; 分配给 IList&lt;Parent&gt;,因为 IList&lt;T&gt; 不是协变的。
    • 这是多态性的正确使用。一般来说,在 .NET 中,如果您正在转换,您可能使用了错误的模式。
    • @Lee 但您可以迭代 List&lt;Child&gt; 并将元素添加到 IList&lt;Parent&gt; 如果 Child : Parent
    • @Lee:因为他只是想迭代 ParentClasses,我的意图是用 List 实例化并添加 ClassA、ClassB 和 ClassC 实例。将编辑我的答案以澄清
    【解决方案3】:

    MyLists的类型改为IEnumerable&lt;ParentClass&gt;。因为IEnumerable&lt;T&gt;covariant,所以这可以工作。

    IEnumerable<ParentClass> MyLists = null;
    // fill it with one of the list types
    foreach (var item in MyLists)
        // do something
    

    【讨论】:

      【解决方案4】:

      假设 MyLists 不是 Object 而是 ParentClass 的 List 您的挑战已经在下面的文章中描述和解决: Convert List<DerivedClass> to List<BaseClass>

      【讨论】:

        【解决方案5】:

        首先将每个列表中的对象转换为 ParentClass。然后,将它们加在一起。然后你可以枚举你的列表:

        var castedlistA = listA.Cast<ParentClass>();
        var castedlistB = listB.Cast<ParentClass>();
        var castedlistC = listC.Cast<ParentClass>();
        
        var fullList = castedListA.AddRange(castedListB).AddRange(castedListC);
        
        foreach (var item in fullList)
        {
            //Do something
        }
        

        【讨论】:

          猜你喜欢
          • 2012-11-02
          • 1970-01-01
          • 1970-01-01
          • 2021-12-06
          • 1970-01-01
          • 2015-11-26
          • 1970-01-01
          • 1970-01-01
          • 2019-06-23
          相关资源
          最近更新 更多