从对象强制转换为 IList<T> 派生类:foreach 失败



我有一个自定义class MyList<T> : MyBaseList, IList<T>,它的一些实例myList1, myList2...,我将其存储为object(来自反射,我无法更改(存储在List<object> ListOfLists = new List<object>()中,因此例如myList1装箱为object存储在ListOfLists[0]等等。

我的类MyList<T>实现:

private List<T> items = new List<T>();
...
IEnumerator IEnumerable.GetEnumerator()
{
return this.items.GetEnumerator();
}

当尝试遍历myList1, myList2...的每个元素时,例如...

bool Iterate<T>(T targetElem)
{
foreach (var listObj in ListOfLists)
{
var myIList= (IList<T>)listObj;
var myEList = myIList.Cast<MyList<T>>();
foreach (var myList in myEList)
{
foreach (var listElem in myList)
{
if (EqualityComparer<T>.Default.Equals(listElem , targetElem)) return true;
}
}
}
return false;
}

。我在foreach (var myList in myEList)收到错误System.InvalidCastException

有没有人知道如何解决这个问题?
提前感谢!

你似乎写了一个额外的foreach循环。要遍历列表列表,您只需要 2。您似乎还试图将每个子列表中的每个T对象强制转换为MyList<T>,这没有多大意义。

您可能打算这样做:

foreach (var listObj in ListOfLists)
{
var myIList= (IList<T>)listObj;
foreach (var listElem in myIList)
{
if (EqualityComparer<T>.Default.Equals(listElem , targetElem)) return true;
}
}
return false;

我不知道你为什么这么确定每个子列表都必须是T的列表。也许其中一个不是,谁知道呢?如果是这种情况,您可以使用as强制转换并检查 null:

foreach (var listObj in ListOfLists)
{
var myIList= listObj as IList<T>;
if (myIList == null) continue;
foreach (var listElem in myIList)
{
if (EqualityComparer<T>.Default.Equals(listElem , targetElem)) return true;
}
}
return false;

问题出在这里:

var myEList = myIList.Cast<MyList<T>>();

在这里,您尝试将myIList中的每个项目转换为MyList<T>的实例。由于Cast的执行是延迟的,因此您在foreach之前不会得到错误。

据我了解你的意图,你应该这样做

var myEList = myIList.Cast<T>();

最新更新