我有一个应该用 Enum
类型指定的泛型类型(实际上,它是几个指定的枚举之一,但我将满足于 System.Enum
) .
当然,编译器会拒绝这样的代码:
class Generic<T> where T : Enum {}
“约束不能是特殊类‘System.Enum’”异常。
到目前为止我能想到的唯一解决方案是使用静态类型初始值设定项来检查类型参数,如果它实际上不是枚举,则抛出异常,如下所示:
class Generic<T>
{
static Generic()
{
if (typeof(T).BaseType != typeof(Enum))
throw new Exception("Invalid Generic Argument");
}
}
这至少为我提供了运行时安全性,我们不会将其与非枚举参数一起使用。然而,这感觉有点 hacky,那么有没有更好的方法来实现这一点,最好是使用编译时构造?
最佳答案
您可以使用 Jon Skeet's Unconstrained Melody项目来做到这一点。
使用 Unconstrained Melody 你会写:
class Generic<T> where T : IEnumConstraint
这会完成同样的事情。
关于c# - 将泛型类型参数限制为 System.Enum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14160669/