从C#中的方法返回通用类的实例

时间:2019-10-17 10:40:30

标签: c# generics

我有一个模板类:

public abstract class Base<T> where T : IConvertible {}

和派生类:

public enum Vals1{}

public class Der1: Base<Vals1> {}


public enum Vals2{}

public class Der2: Base<Vals2> {}

我想编写一个返回Der1Der2实例的方法,但我不知道哪个。

我尝试过这样的事情:

private Base<T> GetDer() where T : IConvertible
{
    if (condition)
        return new Der1();
    return new Der2();
}

但是我得到了错误:

Cannot implicitly convert type 'Der1' to 'Base<T>'
Cannot implicitly convert type 'Der2' to 'Base<T>'

铸造也无济于事。它会返回相同的错误,只是没有单词“隐式”。

有没有一种方法可以简单地做我想做的事情,或者我必须找到其他更费劲的方法?

在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果您创建了另外一个非通用的Base类,则可以从中继承Base<T>

public abstract class Base {}

public abstract class Base<T> : Base where T : IConvertible {}

然后您的方法变为:

private Base GetDer()
{
    if (condition)
        return new Der1();
    return new Der2();
}

这是关于在继承层次结构中查找或添加公共祖先(不是object ...)。当然,您会丢失信息,因为调用GetDer()时会丢失类型信息。

  • 如果以后要在返回的对象上调用的方法不需要T的值,则应将这些方法从Base<T>移到Base类,以便您仍然可以使用它们。

  • 如果要调用的方法需要已定义的T,那么除了在运行时使用某种反射来推断T的类型外,我看不到其他方法dynamic关键字绕过编译时检查:

public abstract class Base<T> : Base where T : IConvertible {
    abstract void MethodFromBaseT();
}

...

dynamic myObject = GetDer();
myObject.MethodFromBaseT(); //does compile

请注意,您必须使用dynamic,因为返回的类型基本上是未知的,因为正如注释中所述,两个不同的Base<T>和不同的T是两个不同的类型,它们不会彼此继承。