仿制药和工厂

OhG*_*Gee 4 c# generics

我是泛型的新手,并且一直在试图弄清楚如何从工厂返回一个基类是通用类的实例.请参阅下面的示例代码 这些问题在工厂类中突出显示:

public abstract class MyGenericBaseClass<T>
{
    public string Foo()
    {...}
}

public sealed class MyDerivedIntClass : MyGenericBaseClass<int>
{

}

public sealed class MyDerivedStringClass : MyGenericBaseClass<string>
{

}

public static class MyClassFactory
{
    public static MyGenericBaseClass<T> CreateMyClass<T>()
    {
        // **********************************************
        if (typeof(T) == typeof(int))
        {
            return new MyDerivedIntClass();
        }

        if (typeof(T) == typeof(string))
        {
            return new MyDerivedStringClass();
        }
        // **********************************************
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎么绕过这个?

非常感谢提前

Ohgee

Ste*_*ger 7

在我的大多数泛型类中,我都放了一个非泛型接口.实际上,我会实现这样的事情:

public interface INonGenericInterface
{
    string Foo();
}

public abstract class MyGenericBaseClass<T> : INonGenericInterface
{
    public string Foo()
    {...}
}

public static class MyClassFactory
{
    public static INonGenericInterface CreateMyDerivedIntClass()
    {
        return new MyDerivedIntClass();
    }

    public static INonGenericInterface CreateMyDerivedStringClass()
    {
        return new MyDerivedStringClass();
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以清楚地说明可以创建哪些类型,并且仍然可以将调用者与具体类型分离.

当然,对于这种情况,您不一定需要非通用接口,但实际上,您很可能需要它.