我正在尝试创建一个包含3种类型的泛型类,可以是简单字符串,IList<string>
或IList<OntologyStore>
。
public class OntologyStore
{
}
public sealed class jim<T> where T:new()
{
string J;
IList<string> X = null;
IList<OntologyStore> X1 = null;
public jim()
{
if (typeof(T) == typeof(String))
{
J = string.Empty;
}
if (typeof(T) == typeof(OntologyStore))
{
X1 = new List<OntologyStore>();
}
if (typeof(T)==typeof(IList))
{
X = new List<string>();
}
}
}
我可以轻松创建,您期望工作,
jim<OntologyStore> x1=new jim<jim<OntologyStore>()
正如您所期望的那样,但是当我放入
时jim<string> x2=new jim<string>()
编译器报告字符串是非abtract类型,您可以期望。
是否可以创建一个泛型类,它可以实例化为包含字符串的类,或IList<string>
或IList<OntologyStore>
?
答案 0 :(得分:1)
这是你不应该尝试创建这样一个类的情况的定义,但是有一个接口(或一个抽象基础),并从中派生出三个不同的具体类。
答案 1 :(得分:1)
我认为你的问题与String类没有“new()”约束所要求的公共无参数构造函数这一事实有关。
答案 2 :(得分:0)
你不能直接用泛型来做这件事。通用约束必须指定一个类型,它是所有实现的约束...在您的情况下,System.String
,IList<String>
和IList<OntologyStore>
没有共同的基类,这是唯一的基类或这些类型的接口(因为System.Object
和IEnumerable
是唯一常见的基类型,我相信......)
但是,在这种情况下,我建议您重新考虑您的设计以避免泛型。
防止重复功能的一个选项是创建一个基类,并有3个工厂方法构造并返回所讨论的特定类型的子类:
public class Jim
{
protected Jim() {}
public Jim Create(string value)
{
return new StringJim(value);
}
private class StringJim : Jim
{
public StringJim(string value) { // ...
}
}
// Do same for IList<string> and IList<OntologyStore>..
// Add common methods here...
}
答案 3 :(得分:0)
你必须设置
public sealed class jim其中T:class,new()
如果你想使用字符串
请点击此处了解更多信息: http://msdn.microsoft.com/en-us/library/d5x73970.aspx
答案 4 :(得分:0)
如果你正在编写一个泛型类,并且你正在根据T的类型做事,那通常表明这对于泛型来说不是一个好的情况,或者你没有正确地构建类。
在这种情况下,它看起来更适合使用接口为类提供共享类型。如果他们最终共享某种实现,那么使用基类而不是接口。