简体   繁体   English

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM