Как конвертировать IList <SomeObject>в IList <ISomeInterface>, где SomeObject реализует ISomeInterface с использованием ковариации в C # 4.0 - PullRequest
2 голосов
/ 09 апреля 2011

Как преобразовать IList в IList, где SomeObject реализует ISomeInterface, используя ковариацию в C # 4.0

У меня есть что-то похожее на следующее

IList<Items> GetItems;

IList<IItems> items = GetItems() as IList<IItems>; 

, но элементы имеют значение null;

Ответ здесь был для до 4.0:

Преобразование массива типа T в массив типа I, где T реализует I в C #

Ответы [ 3 ]

3 голосов
/ 09 апреля 2011

почему бы просто не использовать

IList<Items> GetItems;
IList<IItems> items = GetItems().Cast<IItems>().ToList(); 
2 голосов
/ 09 апреля 2011

Чтобы это работало так, как вы думаете, я считаю, что IList должен быть объявлен как ковариантный, а не элементы в списке. И IList не поддерживает ковариацию. Единственные интерфейсы .NET, которые были обновлены для поддержки ковариации:

  • IEnumerable (T является ковариантным)
  • IEnumerator (T является ковариантным)
  • IQueryable (T является ковариантным)
  • IGrouping (TKey и TElement являются ковариантными)
  • IComparer (T контравариантен)
  • IEqualityComparer (T является контрвариантным)
  • IComparable (T является контрвариантным)

Это от http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx

0 голосов
/ 09 апреля 2011

Технически, следующее будет работать, но я не думаю, что это именно то, что вы ищете ...

IList<IItems> items = GetItems().ToArray() as IList<IItems>;
...