实现泛型类的集合

时间:2013-04-18 14:40:12

标签: c# generics collections

我正在尝试创建如下的自定义类。

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放入自定义集合中。

2 个答案:

答案 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>());