在C#中的列表类型之间转换

时间:2014-01-22 19:42:50

标签: c# list generics type-conversion

我有以下课程:

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?

由于

5 个答案:

答案 0 :(得分:3)

如果您只需要枚举您可以执行的值

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

如果您将MyLists的类型更改为IEnumerable<ParentClass>,则可以避免广播。

答案 1 :(得分:2)

替换

Object MyLists = null;  

用这个

IList<ParentClass> MyLists = null;

像这样实例化MyLists

MyLists = new List<ParentClass>();

现在可以添加ParentClassClassA等实例

答案 2 :(得分:1)

MyLists的类型更改为IEnumerable<ParentClass>。由于IEnumerable<T>covariant,因此可以使用。

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

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

首先将每个列表中的对象强制转换为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
}