如何创建需要3种类型的泛型类

时间:2010-05-12 20:30:47

标签: generics c#-4.0

我正在尝试创建一个包含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>

5 个答案:

答案 0 :(得分:1)

这是你不应该尝试创建这样一个类的情况的定义,但是有一个接口(或一个抽象基础),并从中派生出三个不同的具体类。

答案 1 :(得分:1)

我认为你的问题与String类没有“new()”约束所要求的公共无参数构造函数这一事实有关。

答案 2 :(得分:0)

你不能直接用泛型来做这件事。通用约束必须指定一个类型,它是所有实现的约束...在您的情况下,System.StringIList<String>IList<OntologyStore>没有共同的基类,这是唯一的基类或这些类型的接口(因为System.ObjectIEnumerable是唯一常见的基类型,我相信......)

但是,在这种情况下,我建议您重新考虑您的设计以避免泛型。

防止重复功能的一个选项是创建一个基类,并有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的类型做事,那通常表明这对于泛型来说不是一个好的情况,或者你没有正确地构建类。

在这种情况下,它看起来更适合使用接口为类提供共享类型。如果他们最终共享某种实现,那么使用基类而不是接口。