2

我正在尝试创建一个像这样的自定义类,如下所示。

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

4

2 回答 2

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在基本的 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当然是可选的)

于 2013-04-18T14:48:57.910 回答
0

你的意思是这样的?

List<MyClass<int>> intClassList = new List<MyClass<int>>();
intClassList.Add(new MyClass<int>());
于 2013-04-18T14:43:03.637 回答