向泛型列表中添加不同类型的泛型对象
本文关键字:泛型 同类型 对象 添加 列表 | 更新日期: 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>
。
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提供具体类型,这就是问题所在,一旦您传递它,您只能添加该特定类型的对象。