向泛型列表中添加不同类型的泛型对象

本文关键字:泛型 同类型 对象 添加 列表 | 更新日期: 2023-09-27 18:05:54

是否可以在列表中添加不同类型的泛型对象?如下。

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

有可能吗?

向泛型列表中添加不同类型的泛型对象

一般情况下,您必须使用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);

这在你的情况下不适用,因为:

  • 你正在使用一个泛型类,而不是一个接口
  • 你不能把它变成一个通用的协变接口,因为你已经让T"进入""出"API
  • 您正在使用值类型作为类型参数,这些不与通用变量(所以IEnumerable<int>不是IEnumerable<object>)工作

除非您有ValuePair<T> : ValuePair的非泛型基础类型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; }
}

不,不可能。在本例中,您可以创建一个基类ValuePair, ValuePair<T>从它派生。

据我所知这是不可能的。

:

List<ValuePair> list = new List<ValuePair>();
您在示例中编写的

没有为T提供具体类型,这就是问题所在,一旦您传递它,您只能添加该特定类型的对象。