如果你想混合不同的泛型类型(所以有一个包含两者的集合MyClass<int>
和MyClass<string>
)你需要定义一些通用的基本类型或使用非强类型的集合:
public class MyClass<T> : MyClass
{
public T Value2 { get; set; }
}
public class MyClass
{
public string Value1 { get; set; }
public string Value3 { get; set; }
}
然后你可以定义一个集合,如:
List<MyClass> list = new List<MyClass>();
list.Add(new MyClass<int>());
list.Add(new MyClass<string>());
但是,您必须在检索条目时转换结果才能访问它们的Value2
属性。
避免基类的另一种选择是简单地使用List<object>
:
List<object> list = new List<object>();
list.Add(new MyClass<int>());
list.Add(new MyClass<string>());
但这与上面的问题相同,但似乎更糟(因为你可以在那里存储任何东西)
编辑:有多种方法可以Value2
在基本的 non-generic 中允许无类型访问MyClass
。一种方法是在基类上定义它的“无类型”版本,并在执行类型检查的子类上覆盖它:
public abstract class MyClass
{
public string Value1 { get; set; }
public abstract object Value2Untyped { get; set; }
public string Value3 { get; set; }
}
public class MyClass<T> : MyClass
{
public T Value2 { get; set; }
public override object Value2Untyped
{
get
{
return Value2;
}
set
{
Value2 = (T)value;
}
}
}
然后,对于针对基本 non-generic 键入的所有对象或集合MyClass
,您仍然可以访问值,甚至可以在运行时设置值。(set
当然是可选的)