[英]Casting from object to IList<T> derived class: foreach fails
I have a custom class MyList<T> : MyBaseList, IList<T>
and some instances of it myList1, myList2...
, which i store as object
(comes from reflection, i can not change) in a List<object> ListOfLists = new List<object>()
, so for example myList1
boxed as an object
is stored at ListOfLists[0]
and so on.我有一个自定义class MyList<T> : MyBaseList, IList<T>
和它的一些实例myList1, myList2...
,我在List<object> ListOfLists = new List<object>()
存储为object
(来自反射,我无法更改) List<object> ListOfLists = new List<object>()
,例如myList1
作为object
装箱存储在ListOfLists[0]
等等。
My class MyList<T>
implements:我的类MyList<T>
实现:
private List<T> items = new List<T>();
...
IEnumerator IEnumerable.GetEnumerator()
{
return this.items.GetEnumerator();
}
When trying to iterate through every element of myList1, myList2...
like...当试图遍历myList1, myList2...
每个元素时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;
}
... I receive Error System.InvalidCastException
at foreach (var myList in myEList)
. ...我在foreach (var myList in myEList)
收到 Error System.InvalidCastException
。
Has anyone an idea on how to solve this issue?有没有人知道如何解决这个问题?
Thanks in advance!提前致谢!
You seem to have written an extra foreach
loop.您似乎编写了一个额外的foreach
循环。 To iterate over a list of lists, you only need 2. You also seem to be trying to cast each T
object in each sublist to MyList<T>
, which doesn't make much sense.要遍历列表列表,您只需要 2 个。您似乎还试图将每个子列表中的每个T
对象强制转换为MyList<T>
,这没有多大意义。
You probably intended this:你可能打算这样做:
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;
I don't know why you are so sure that every sublist must be a list of T
.我不知道为什么您如此确定每个子列表都必须是T
的列表。 Maybe one of them isn't, who knows?也许其中之一不是,谁知道呢? If this is the case, you can use as
to cast and check for null:如果是这种情况,您可以使用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;
The problem lies here:问题出在这里:
var myEList = myIList.Cast<MyList<T>>();
Here you are trying to cast every item in myIList
to an instance of MyList<T>
.在这里,您尝试将myIList
中的每个项目转换为myIList
MyList<T>
的实例。 Since the execution of Cast
is deferred you get the error not before the foreach
.由于Cast
的执行被推迟,因此您不会在foreach
之前收到错误。
As far as I understand your intention you should do据我了解你的意图你应该做
var myEList = myIList.Cast<T>();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.