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

标签 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,那么有没有更好的方法来实现这一点,最好是使用编译时构造?

最佳答案

您可以使用 Jon Skeet's Unconstrained Melody项目来做到这一点。

使用 Unconstrained Melody 你会写:

class Generic<T> where T : IEnumConstraint

这会完成同样的事情。

More info about Unconstrained Melody with usage examples.

关于c# - 将泛型类型参数限制为 System.Enum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14160669/

相关文章:

c# - 避免在 ASP.NET 上打印 HTML 标记

c# - 在运行时修改 linq 查询

c#-4.0 - 为仅在运行时已知的类型创建已编译的 Expession.Lambda

Java 枚举(或 int 常量)与 C 枚举

swift - 枚举案例可以包含类列表吗?

c# - 如何判断一个元素是否与CSS选择器匹配?

java - 静态接口(interface)方法与通用单例工厂的区别?

java - Java 编译器如何处理多个泛型边界?

php - 插入枚举数据类型列的查询.. 从选定的复选框中获取值

c# - mkbundle组合DLL在其他项目中引用时导致Invalid Metadata异常