我有一个自定义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>();