我有一个应该用类型指定的泛型类型Enum
(实际上,它是几个指定的枚举之一,但我会接受System.Enum
)。
当然,编译器会拒绝以下代码:
class Generic<T> where T : Enum {}
带有“约束不能是特殊类'System.Enum'”异常。
到目前为止,我能够提出的唯一解决方案是使用静态类型初始化程序来检查类型参数,如果它实际上不是 Enum,则抛出异常,如下所示:
class Generic<T>
{
static Generic()
{
if (typeof(T).BaseType != typeof(Enum))
throw new Exception("Invalid Generic Argument");
}
}
这至少给了我运行时安全性,我们不会将其与非枚举参数一起使用。然而,这感觉有点 hacky,那么有没有更好的方法来完成这个,理想情况下使用编译时构造?