不知道类型返回通用(Returning generic without knowing type)

2019-07-31 23:53发布

我有一个情况我有接受其泛型类型参数的某个对象类型的实例类。 布局是这样的:

public abstract BaseClass { ... }
public DiamondClass : BaseClass { ... }
public SilverClass : BaseClass { ... }

public Handler<T> where T : BaseClass { ... }

我希望能够创建返回的一个实例的方法Handler<DiamondClass>Handler<BaseClass>不妨碍输入定义的类型。 我试着沿着这些路线的东西:

public Handler<BaseClass> GetHandler(HandlerType type)
{
    switch(type)
    {
        case HandlerType.Diamond: return new Handler<DiamondClass>();
        case HandlerType.Silver: return new Handler<SilverClass>();
        default: throw new InvalidOperationException("...");
    }
}

但是,这是行不通的,因为很明显Handler<DiamondClass>不会隐式转换为Handler<BaseClass> 。 我可以像这样指定它:

public Handler<T> GetHandler<T>(HandlerType type) where T : BaseClass
{
    switch(type)
    {
        case HandlerType.Diamond: return (Handler<T>)new Handler<DiamondClass>();
        case HandlerType.Silver: return (Handler<T>)new Handler<SilverClass>();
        default: throw new InvalidOperationException("...");
    }
}

但现在我需要调用GetHandler<DiamondClass>GetHandler<BaseClass> 。 并且击败具有返回基于一个枚举适当的处理程序的方法的目的,在不知道的类型。 我希望我可以定义一个Type的对象,并通过它,因为这样的:

 Type objType = typeof(DiamondClass);
 var handler = Handler<objType>();

但很显然,C#不会让那种愚蠢的。 我已经走了一下这几款不同的方式,我想,认为有办法做到这一点,但我很为难。


(我确实是通过返回一个得到这个工作dynamic对象,但我想避免,如果可能的话,因为它失去了任何类型的安全和智能的支持。)

Answer 1:

这是协方差进场时,协方差和反方差仅仅只在接口和委托的工作,所以,要解决你的问题,只是定义一个新的接口IHandler作为共同变异out指定类型参数是协-variant:

public interface IHandler<out T> where T : BaseClass 
{
}

具有协变型参数的接口使得它的方法比由type参数指定返回更多派生类型

它将工作。 更多信息,请点击这里



文章来源: Returning generic without knowing type