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

时间:2011-08-17 06:05:02

标签: c# c#-4.0 c#-3.0

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

public class ValuePair<T>
{        
    public string Name { get; set;}
    public T Value { get; set;                     
}

让我说我有所有这些对象......

 ValuePair<string> data1 =  new ValuePair<string>();
 ValuePair<double> data2 =  new ValuePair<double>();
 ValuePair<int> data3 =  new ValuePair<int>();

我想将这些对象保存在通用列表中,例如

List<ValuePair> list = new List<ValuePair>();

list.Add(data1);
list.Add(data2);
list.Add(data3);

有可能吗?

4 个答案:

答案 0 :(得分:12)

通常,您必须使用List<object>或创建非泛型基类,例如。

public abstract class ValuePair
{
    public string Name { get; set;}
    public abstract object RawValue { get; }
}

public class ValuePair<T> : ValuePair
{
    public T Value { get; set; }              
    public object RawValue { get { return Value; } }
}

然后你可以拥有List<ValuePair>

现在,有一个一个例外:C#4中的协变/逆变类型。例如,你可以写:

var streamSequenceList = new List<IEnumerable<Stream>>();

IEnumerable<MemoryStream> memoryStreams = null; // For simplicity
IEnumerable<NetworkStream> networkStreams = null; // For simplicity
IEnumerable<Stream> streams = null; // For simplicity

streamSequenceList.Add(memoryStreams);
streamSequenceList.Add(networkStreams);
streamSequenceList.Add(streams);

这不适用于您的情况,因为:

  • 您使用的是通用类,而不是接口
  • 您无法将其更改为通用的协变界面,因为您已经{“1}}进入”“out”API < / LI>
  • 您正在使用值类型作为类型参数,而那些不适用于通用变量(因此T不是IEnumerable<int>

答案 1 :(得分:5)

除非你有一个带有ValuePair的非通用基类型ValuePair<T> : ValuePair(它也可以用于接口),或者使用List<object>。实际上,这可以合理地起作用:

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<T> : ValuePair
{
    protected override object GetValue() { return Value; }
    protected override void SetValue(object value) { Value = (T)value; }
    public new T Value { get; set; }
}

答案 2 :(得分:1)

不,这是不可能的。在您的情况下,您可以创建ValuePair派生的基类ValuePair<T>。取决于你的目的。

答案 3 :(得分:1)

据我所知,这是不可能的。

行:

List<ValuePair> list = new List<ValuePair>();

你在样本中写道并没有提供T的具体类型,这就是问题,一旦你通过它,你只能添加那种特定类型的对象。