我正在尝试创建如下的自定义类。
public MyClass<T>
{
public string Value1 { get; set; }
public T Value2 { get; set; }
public string Value3 { get; set; }
}
T的值可以是string或int或datetime。我假设我可以创建此类的新实例,如
MyClass<int> intclass = new MyClass<int>();
MyClass<String> stringclass=new MyClass<String>();
等等。
是否可以创建上述类的集合,我可以将intclass和stringclass放入自定义集合中。
答案 0 :(得分:5)
如果要混合使用不同的泛型类型(因此要有一个包含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
中的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;
}
}
}
然后,针对基本非泛型MyClass
键入的所有对象或集合,您仍然可以访问值,甚至可以在运行时设置值。 (set
当然是可选的)
答案 1 :(得分:0)
List<MyClass<int>> intClassList = new List<MyClass<int>>();
intClassList.Add(new MyClass<int>());