2013-04-18 98 views
2

我想创建一个像这样的自定义类,如下所示。实现一个通用类的集合

public MyClass<T> 
{ 
    public string Value1 { get; set; } 
    public T Value2 { get; set; } 
    public string Value3 { get; set; } 
} 

T的值可以是字符串或int或日期时间。我认为我可以像

MyClass<int> intclass = new MyClass<int>(); 
MyClass<String> stringclass=new MyClass<String>(); 

等创建这个类的新实例。

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

+0

你知道吗,如果你想把它们放到一个集合中,你需要从对象中返回'int'和'string'? –

+0

是的,我明白 – cableload

+0

可能的重复/相关:http://stackoverflow.com/questions/15833397/generic-collection-in-generic-class/15833511#15833511 – Clint

回答

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

你将不得不投结果磨片n检索条目,以便访问他们的Value2属性。

另一种选择,以避免基类是简单地用一个List<object>

List<object> list = new List<object>(); 
list.Add(new MyClass<int>()); 
list.Add(new MyClass<string>()); 

但它同样的问题同上,但振振有词糟糕(因为这样你可以在那里存放什么

编辑:如何允许在非基类非MyClass中对Value2进行无类型访问的方法有多种。一种方法是定义在基类的它的“类型化”版本,并覆盖其上会进行类型检查的子类:

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

+1将常见行为提取到'MyClass'中 –

0

你的意思是这样的?

List<MyClass<int>> intClassList = new List<MyClass<int>>(); 
intClassList.Add(new MyClass<int>()); 
+0

No..your example would only have a collection of base type MyClass ... where T is int..i want my custom collection to have a base type of T where T could be int/string/datetime – cableload

+0

@Marco Forberg ,OP希望处理int和字符串集合!!! – David

+0

我不知道这是否可行,因为我发现类型安全问题 –