c# - C#:是否可以为类型约束强制转换泛型类型?
问题描述
我正在创建一个工厂方法,该方法根据方法调用中的泛型类型确定要返回的对象
public IDbStrategy<T> GetDefaultStrategy<T>()
{
return typeof(T).IsAssignableFrom(typeof(DbModel))
? new DefaultModelDbStrategy<T>()
: new DefaultDbStrategy<T>();
}
theDefaultModelDbStrategy
作为类型约束,where T : DbModel
但DefaultDbStrategy
不是。尝试将其T
用作泛型类型时出现编译器错误,DefaultModelDbStrategy
因为编译器不知道它T
是DbModel
. 有没有办法确保我的编译器传入的泛型参数确实源自DbModel
上面的反射语句断言?
谢谢
解决方案
并非没有反思。因为T
在编译时静态解析,编译器需要实例化类型DefaultModelDbStrategy<object>
(如果 T 是object
),但这是非法类型。方法中使用的类型需要在方法被 JIT 时解析,而不仅仅是在执行特定行时。
不过有一个使用反射的解决方法:你可以做
(IDbStrategy<T>)Activator.CreateInstance(typeof(DefaultModelDbStrategy<>).MakeGenericType(typeof(T)));
这将创建一个具有给定 T 的 DefaultModelDbStrategy 实例。如果 T 不满足约束,它将引发运行时错误。
推荐阅读
- redis - 检查某个列表元素在 Redis 列表中的当前位置
- typescript - 使用 Typeorm 和 Express.js 的无服务器 Typescript Rest API
- javascript - Node.js - SequelizeDatabaseError:列“user_id”不存在
- javascript - discord.js 问题:我如何实现一个只允许具有踢和管理员权限的人使用该命令的命令
- c# - C# - 在变量中保留正确猜测的总数
- elasticsearch - “应该”查询影响评分,如何避免?
- r - 多次加入和替换列
- linux - USB 驱动程序:usb_register 函数未返回或未按预期运行
- c - 什么是通过套接字发送请求的良好指标?
- python - VSCode 中的 TensorFlow 导入失败