将不同类型的通用对象添加到通用列表中

是否可以将不同类型的通用对象添加到列表中? 如下。

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 : ValuePair的非generics基类型ValuePair 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的具体类型,这就是问题,一旦你通过它,你只能添加该特定类型的对象。