Преобразование из объекта в производный класс IList <T>: foreach завершается неудачно - PullRequest
0 голосов
/ 13 января 2020

У меня есть пользовательский 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;
}

... Я получаю сообщение об ошибке System.InvalidCastException в foreach (var myList in myEList).

Кто-нибудь знает, как решить эту проблему?
Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 13 января 2020

Вы, кажется, написали дополнительно foreach l oop. Чтобы перебрать список списков, вам нужно только 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 для приведения и проверки на нулевое значение:

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;
0 голосов
/ 13 января 2020

Проблема заключается здесь:

var myEList = myIList.Cast<MyList<T>>();

Здесь вы пытаетесь привести каждый предмет в myIList к экземпляру MyList<T>. Поскольку выполнение Cast откладывается, вы получаете ошибку не раньше foreach.

Насколько я понимаю, ваше намерение вам следует сделать

var myEList = myIList.Cast<T>();
...