在 C# 中使用枚举作为泛型类型参数 [重复]

Posted

技术标签:

【中文标题】在 C# 中使用枚举作为泛型类型参数 [重复]【英文标题】:Using enum as generic type parameter in C# [duplicate] 【发布时间】:2011-06-22 10:27:37 【问题描述】:

可能重复:Enum type constraints in C#

是否可以通过使用其包装类Enumenum 类型用作泛型参数?

我有不同的枚举:

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 类的成员和方法。那么是否可以按照我的意图实现它或者我应该使用什么其他方法?

【问题讨论】:

在 C# 7.3 中引入:docs.microsoft.com/en-us/dotnet/csharp/programming-guide/… @Fildor 问题已关闭,我无法添加新答案。顶部链接的问题也已关闭。然后下一个链接的问题有一个答案***.com/a/50289291/617543。 :-) 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于在 C# 中使用枚举作为泛型类型参数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在C#中将类型参数传递给泛型[重复]

C#泛型 类型约束

c#中泛型类型的默认值[重复]

多类型参数约束的C#泛型语法[重复]

C#如何将类型Type作为泛型T的参数T传递

C# 深入了解泛型