我有以下课程:
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?
由于
答案 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>();
现在可以添加ParentClass
,ClassA
等实例
答案 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
}