实现泛型类的集合

cab*_*oad 2 c# generics collections

我正在尝试按如下方式创建这样的自定义类.

public MyClass<T> 
{
    public string Value1 { get; set; }
    public T Value2 { get; set; }
    public string Value3 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

T的值可以是字符串或int或datetime.我假设我可以创建此类的新实例

MyClass<int> intclass = new MyClass<int>();
MyClass<String> stringclass=new MyClass<String>();
Run Code Online (Sandbox Code Playgroud)

等等.

是否可以创建上述类的集合,我可以将intclass和stringclass放入自定义集合中.

Chr*_*air 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; }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以定义一个集合,如:

List<MyClass> list = new List<MyClass>();
list.Add(new MyClass<int>());
list.Add(new MyClass<string>());
Run Code Online (Sandbox Code Playgroud)

在检索条目时,您必须投射结果才能访问其Value2属性.

避免基类的另一个选择就是使用List<object>:

List<object> list = new List<object>();
list.Add(new MyClass<int>());
list.Add(new MyClass<string>());
Run Code Online (Sandbox Code Playgroud)

但它与上面的问题相同,但可能更糟糕(因为那时你可以在那里存储任何东西)

编辑:有多种方法可以允许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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,对于基于非泛型的所有对象或集合MyClass,您仍然可以访问值,甚至可以在运行时设置值.(set当然是可选的)