从对象转换为 IList<T> 派生 class:foreach 失败
Casting from object to IList<T> derived class: foreach fails
我有一个自定义 class MyList<T> : MyBaseList, IList<T>
和它的一些实例 myList1, myList2...
,我将其存储为 object
(来自反射,我无法更改)在 List<object> ListOfLists = new List<object>()
,因此例如 myList1
装箱为 object
存储在 ListOfLists[0]
等。
我的classMyList<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
。
有人知道如何解决这个问题吗?
提前致谢!
问题出在这里:
var myEList = myIList.Cast<MyList<T>>();
此处您试图将 myIList
中的每个项目都转换为 MyList<T>
的实例。由于 Cast
的执行被推迟,您不会在 foreach
.
之前收到错误
据我了解你的意图你应该这样做
var myEList = myIList.Cast<T>();
您似乎写了一个额外的 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;
我有一个自定义 class MyList<T> : MyBaseList, IList<T>
和它的一些实例 myList1, myList2...
,我将其存储为 object
(来自反射,我无法更改)在 List<object> ListOfLists = new List<object>()
,因此例如 myList1
装箱为 object
存储在 ListOfLists[0]
等。
我的classMyList<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
。
有人知道如何解决这个问题吗?
提前致谢!
问题出在这里:
var myEList = myIList.Cast<MyList<T>>();
此处您试图将 myIList
中的每个项目都转换为 MyList<T>
的实例。由于 Cast
的执行被推迟,您不会在 foreach
.
据我了解你的意图你应该这样做
var myEList = myIList.Cast<T>();
您似乎写了一个额外的 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;