从对象转换为 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;