C# 实现泛型类的集合
我正试图创建一个如下所示的自定义类C# 实现泛型类的集合,c#,generics,collections,C#,Generics,Collections,我正试图创建一个如下所示的自定义类 public MyClass<T> { public string Value1 { get; set; } public T Value2 { get; set; } public string Value3 { get; set; } } 公共MyClass { 公共字符串值1{get;set;} 公共T值2{get;set;} 公共字符串值3{get;set;} } T的值可以是string、int或dateti
public MyClass<T>
{
public string Value1 { get; set; }
public T Value2 { get; set; }
public string Value3 { get; set; }
}
公共MyClass
{
公共字符串值1{get;set;}
公共T值2{get;set;}
公共字符串值3{get;set;}
}
T的值可以是string、int或datetime
MyClass<int> intclass = new MyClass<int>();
MyClass<String> stringclass=new MyClass<String>();
MyClass intclass=newmyclass();
MyClass stringclass=新的MyClass();
等等
是否可以创建上述类的集合,以便将intclass和stringclass放入自定义集合中。您的意思是这样的
List<MyClass<int>> intClassList = new List<MyClass<int>>();
intClassList.Add(new MyClass<int>());
List intClassList=newlist();
添加(新的MyClass());
如果要混合不同的泛型类型(因此有一个同时包含MyClass
和MyClass
)的集合,则需要定义一些常见的基类型或使用非强类型的集合:
public class MyClass<T> : MyClass
{
public T Value2 { get; set; }
}
public class MyClass
{
public string Value1 { get; set; }
public string Value3 { get; set; }
}
但问题与上面的相同,但似乎更糟(因为这样你就可以在那里存储任何东西)
编辑:有多种方法可以允许对基本非泛型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
{
公共字符串值1{get;set;}
公共抽象对象值2非类型化{get;set;}
公共字符串值3{get;set;}
}
公共类MyClass:MyClass
{
公共T值2{get;set;}
公共重写对象值2未类型化
{
得到
{
返回值2;
}
设置
{
Value2=(T)值;
}
}
}
然后,对于根据基本非泛型
MyClass
键入的所有对象或集合,您仍然可以访问值,甚至在运行时设置值。(设置当然是可选的)否。您的示例只会有一个基类型MyClass的集合…其中T是int。我希望我的自定义集合有一个基类型T,其中T可以是int/string/datetime。我不知道这是否可行,因为我看到了类型安全的问题。您明白吗,如果您想将它们放在一个集合中,您需要从对象中强制转换int
和string
?可能重复/相关:感谢大家的快速回答。。。!!
List<object> list = new List<object>();
list.Add(new MyClass<int>());
list.Add(new MyClass<string>());
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;
}
}
}