【发布时间】:2015-12-22 10:35:37
【问题描述】:
我想以一种有效的方式实现我的通用 IQueue<T> 接口,如果 T 是 struct 则执行一个实现,如果 T 是一个类则执行另一个实现。
interface IQueue<T> { ... }
class StructQueue<T> : IQueue<T> where T : struct { ... }
class RefQueue<T> : IQueue<T> where T : class { ... }
我想要一个工厂方法,它基于 T 的种类返回一个或另一个实例:
static IQueue<T> CreateQueue<T>() {
if (typeof(T).IsValueType) {
return new StructQueue<T>();
}
return new RefQueue<T>();
}
当然,编译器指出 T 应该分别是不可空/可空类型参数。
有没有办法将 T 转换为结构类型(以及类类型)以使方法编译?这种运行时调度甚至可以用 C# 实现吗?
【问题讨论】:
-
你可以使用反射
-
请注意,可空值类型不通过
class和struct约束。对于这种情况,您应该有第三个实现类。