将不同类型的通用对象添加到通用列表中
是否可以将不同类型的通用对象添加到列表中? 如下。
public class ValuePair { public string Name { get; set;} public T Value { get; set; }
让我说我有所有这些对象……
ValuePair data1 = new ValuePair(); ValuePair data2 = new ValuePair(); ValuePair data3 = new ValuePair();
我想将这些对象保存在通用列表中。如
List list = new List(); list.Add(data1); list.Add(data2); list.Add(data3);
可能吗?
通常,您必须使用List
或创建非generics基类,例如
public abstract class ValuePair { public string Name { get; set;} public abstract object RawValue { get; } } public class ValuePair : ValuePair { public T Value { get; set; } public object RawValue { get { return Value; } } }
然后你可以有一个List
。
现在,有一个例外:C#4中的协变/逆变类型。例如,您可以编写:
var streamSequenceList = new List>(); IEnumerable memoryStreams = null; // For simplicity IEnumerable networkStreams = null; // For simplicity IEnumerable streams = null; // For simplicity streamSequenceList.Add(memoryStreams); streamSequenceList.Add(networkStreams); streamSequenceList.Add(streams);
这不适用于您的情况,因为:
- 您使用的是通用类,而不是接口
- 您无法将其更改为通用的协变接口,因为您已经在API中“进入” 和 “退出”
- 您使用值类型作为类型参数,而那些不适用于generics变量(因此
IEnumerable
不是IEnumerable
)
除非你有一个带有ValuePair
的非generics基类型ValuePair
ValuePair
(它也适用于接口),或者使用List
。 实际上,这可以合理地起作用:
public abstract class ValuePair { public string Name { get; set; } public object Value { get { return GetValue(); } set { SetValue(value); } } protected abstract object GetValue(); protected abstract void SetValue(object value); } public class ValuePair : ValuePair { protected override object GetValue() { return Value; } protected override void SetValue(object value) { Value = (T)value; } public new T Value { get; set; } }
不,这是不可能的。 在您的情况下,您可以创建ValuePair
派生的基类ValuePair
。 取决于您的目的。
据我所知,这是不可能的。
这条线:
List list = new List ();
你在样本中写的并没有提供T的具体类型,这就是问题,一旦你通过它,你只能添加该特定类型的对象。