Как реализовать IList<parent> = IList<child>
От: dm-CaT  
Дата: 11.08.07 10:52
Оценка:
Есть классы

public class Parent
{}

public class ChildOne : Parent
{}



Текущее решение при переприсваивании списков:

public class Manager
{
  private IList<Parent> _items = new List<Parent>();

  public void DoSomething()
  {
    IList<ChildOne> childrenOne = GetChildrenOne();
    foreach (ChildOne child in childrenOne)
    {
      _items.Add(child);
    }
  }

  public IList<ChildOne> GetChildrenOne()
  {
    List<ChildOne> children = new List<ChildOne>();
    ...
    return children;
  }
}



А хотелось бы чего-то типа:

public class Manager
{
  private IList<Parent> _items = null;

  public void DoSomething()
  {
    _items = GetChildrenOne();
  }
...
}



Есть ли какое-то решение или так и придётся по одному переприсваивать?
Re: Как реализовать IList<parent> = IList<child>
От: nikov США http://www.linkedin.com/in/nikov
Дата: 11.08.07 14:02
Оценка: +1
Здравствуйте, dm-CaT, Вы писали:

DC>Есть ли какое-то решение или так и придётся по одному переприсваивать?


Придется по одному — так как дженерики в C# не могут быть ковариантны. Конкретно в случае с mutable списком (каким является класс List<T>) невозможно было бы сделать безопасную ковариантность, даже если бы язык ее поддерживал.
Re[2]: Как реализовать IList<parent> = IList<child>
От: desco США http://v2matveev.blogspot.com
Дата: 12.08.07 08:54
Оценка: 1 (1)
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, dm-CaT, Вы писали:


DC>>Есть ли какое-то решение или так и придётся по одному переприсваивать?


N>Придется по одному — так как дженерики в C# не могут быть ковариантны. Конкретно в случае с mutable списком (каким является класс List<T>) невозможно было бы сделать безопасную ковариантность, даже если бы язык ее поддерживал.


+1

аккуратнее можно было бы вывернуться в случае, если бы требовалось преобразование IEnumerable<parent> = IEnumerable<child>.

static class CovariantEnumAdapter<TBase>
{
  public static IEnumerable<TBase> Get<TDerived>(IEnumerable<TDerived> enumerable)
     where TDerived : TBase
  {
     foreach (TDerived item in enumerable)
     {
        yield return item;
     }
  }
}

class Base {}
class Derived : Base {}

IEnumerable<Derived> enum1 = ...
IEnumerable<Base> enum2 = CovariantEnumAdapter<Base>.Get(enum1);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.