Универсальная коллекция общих классов? - PullRequest
4 голосов
/ 17 декабря 2009

У меня есть класс, который я заполняю из базы данных:

public class Option<T>
{
  public T Value { get; set; }
  public T DefaultValue { get; set; }
  public List<T> AvailableValues { get; set; }
}

Я хочу иметь их коллекцию:

List<Option<T>> list = new List<Option<T>>();
Option<bool> TestBool = new Option<bool>();
TestBool.Value = true;
TestBool.DefaultValue = false;
list.Add(TestBool);
Option<int> TestInt = new Option<int>();
TestInt.Value = 1;
TestInt.DefaultValue = 0;
list.Add(TestInt);

Кажется, это не работает. Идеи?

Ответы [ 4 ]

12 голосов
/ 17 декабря 2009

Я подозреваю, что вам действительно нужен неуниверсальный базовый класс - в противном случае между различными Option<T> закрытыми типами нет ничего общего.

Я понимаю, что вы пытаетесь сделать, но .NET-дженерики не позволяют вам выразить эти отношения. Это все равно что пытаться создать карту из Type для экземпляра этого типа ... она просто не летает: (

7 голосов
/ 17 декабря 2009

Вы должны указать тип вместо параметра шаблона:

List<Option<T>> list = new List<Option<T>>();

становится

List<Option<bool>> list = new List<Option<bool>>();

Добавление элементов типа Option<int> в тот же список не сработает, но это отдельная проблема, чем я рассмотрел выше.

0 голосов
/ 17 декабря 2009

То, что вы делаете, работает только с разнородными списками.

List<T> - это однородный список типа T, означающий, что все элементы должны быть типа T. Поскольку Option<bool> и Option<int> не имеют общего предка, кроме object, вы не сможете сделать это, если не используете List<object> или старый ArrayList, оба из которых действуют как гетерогенные списки.

Подумайте о получении объектов из этого списка:

list.Add(TestBool);
list.Add(TestInt);

for(int i = 0; i < list.Count; i++)
{
   list[i].Value // <- what's the type of this?
}
0 голосов
/ 17 декабря 2009

Первая строка, которую вы должны сказать, тип T.

List<Option<bool>> list = new List<Option<bool>>();

А также вы не можете поместить этот TestInt в этот список ...

...