将泛型类型参数限制为System.Enum

时间:2013-01-04 16:11:06

标签: c# generics enums

我有一个泛型类型,应该用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,所以是否有更好的方法来实现这一点,理想情况下使用编译时构造?

4 个答案:

答案 0 :(得分:6)

您可以使用Jon Skeet's Unconstrained Melody项目执行此操作。

使用Unconstrained Melody,你会写:

class Generic<T> where T : IEnumConstraint

哪个会完成同样的事情。

More info about Unconstrained Melody with usage examples.

答案 1 :(得分:4)

不幸的是,没有办法确保在编译时传递给泛型类的类型是枚举。您只能添加以下约束:

class Generic<T> where T : struct { }

为了排除所有引用类型,但仍需要运行时检查。

答案 2 :(得分:1)

我认为你可以使用Struct:

class Generic<T> where T : Struct

答案 3 :(得分:1)

枚举也实现了IConvertible接口,因此您可以将其作为约束与结构一起添加。

class Generic<T> where T : struct, IConvertible {}