2009-12-17 3 views
4

У меня есть класс, который я заполнить из базы данных:Общая коллекция общих классов?

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); 

Это не похоже на работу. Идеи?

+0

Вы получаете исключение? –

+0

Не могли бы вы рассказать о том, что «это не работает?» – iandisme

+0

@Dave, iandisme: Он не будет компилироваться. «Тип или имя пространства имен« T »не удалось найти (вы не указали директиву использования или ссылку на сборку?)» –

ответ

12

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

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

7

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

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

становится

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

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

0

Флаг линии вы должны сказать, что тип T есть.

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

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

0

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

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? 
} 
Смежные вопросы