使用枚举作为C#中的泛型类型参数
本文关键字:泛型类型参数 枚举 | 更新日期: 2023-09-27 18:00:05
可能重复:
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
类的成员和方法。那么,有可能按照我想要的方式来实现它吗?或者我应该使用什么其他方法?
不,不幸的是,这是不可能的。你能做的最好的事情就是使用where T : struct, IComparable, IConvertible, IFormattable
(当然这是不一样的)。接口限制源于System.Enum
的实现。
除此之外,您还可以检查typeof(T).IsEnum
,它可以在运行时检测到问题,并可能引发异常。但是在编译时没有办法强制执行这个限制。
这在C#的语言级别是不可行的,但它受到底层CLR的支持。您可以使用Jon Skeet的Unconstrained Melody,它将生成的二进制文件转换为具有实际枚举通用约束的二进制文件。