在C#中使用enum作为泛型类型参数

时间:2011-06-22 10:27:38

标签: c# generics enums

  

可能重复:
  Enum type constraints in C#

是否可以使用enum类型作为通用参数使用其包装类Enum

我有不同的枚举:

enum errors1 { E1, E3, E8 };
enum errors2 { E0, E2, E9 };
enum errors3 { E7, E4, E5 };

通过以下课程声明我认为我可以实现它:

public class MyErrors<T> where T : Enum
{
   T enumeration;

   public T getEnumeration()
   {
       return enumeration;
   }

   static void Main(string[] args)
   {

       Program<error1> p = new Program<error1>();
       p.getEnumeration().E1  // this call does NOT work
   }

但是,由于常规类型为Enum,因此我只能访问Enum类的成员和方法。那么我可以按照我的意图实现它,或者我应该使用其他方法吗?

2 个答案:

答案 0 :(得分:39)

不,不幸的是,这是不可能的。你能做的最好的就是使用where T : struct, IComparable, IConvertible, IFormattable(当然不一样)。接口限制源自System.Enum的实现。

除此之外,您可以检查是否typeof(T).IsEnum,它可以在运行时检测到问题,并可能抛出异常。但是在编译时没有办法强制执行此限制。

答案 1 :(得分:12)

这在C#的语言级别上是不可行的,但它受到底层CLR的支持。您可以使用Jon Skeet的Unconstrained Melody,它将生成的二进制文件转换为具有实际枚举通用约束的二进制文件。