是否可以将不同类型的通用对象添加到列表中?如下所示。
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);
有可能吗?
答案 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);
这不适用于您的情况,因为:
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的具体类型,这就是问题,一旦你通过它,你只能添加那种特定类型的对象。