首页 > 解决方案 > C#:是否可以为类型约束强制转换泛型类型?

问题描述

我正在创建一个工厂方法,该方法根据方法调用中的泛型类型确定要返回的对象

public IDbStrategy<T> GetDefaultStrategy<T>()
{
    return typeof(T).IsAssignableFrom(typeof(DbModel))
        ? new DefaultModelDbStrategy<T>()
        : new DefaultDbStrategy<T>();
}

theDefaultModelDbStrategy作为类型约束,where T : DbModelDefaultDbStrategy不是。尝试将其T用作泛型类型时出现编译器错误,DefaultModelDbStrategy因为编译器不知道它TDbModel. 有没有办法确保我的编译器传入的泛型参数确实源自DbModel上面的反射语句断言?

谢谢

标签: c#

解决方案


并非没有反思。因为T在编译时静态解析,编译器需要实例化类型DefaultModelDbStrategy<object>(如果 T 是object),但这是非法类型。方法中使用的类型需要在方法被 JIT 时解析,而不仅仅是在执行特定行时。

不过有一个使用反射的解决方法:你可以做

(IDbStrategy<T>)Activator.CreateInstance(typeof(DefaultModelDbStrategy<>).MakeGenericType(typeof(T)));

这将创建一个具有给定 T 的 DefaultModelDbStrategy 实例。如果 T 不满足约束,它将引发运行时错误。


推荐阅读