如何在C#中使用一组枚举值?

Ian*_*oyd 3 c# enums set

假设我有一个枚举:

namespace System.Windows.Forms
{
   public enum DialogResult { None, OK, Cancel, Abort, Retry, Ignore, Yes, No }
}
Run Code Online (Sandbox Code Playgroud)

我想声明一个由这些枚举类型组成的"集合"

ShowForm(Form frm, DialogResults allowedResults)
Run Code Online (Sandbox Code Playgroud)

在其他语言中,您将声明:

public DialogResults = set of DialogResult;
Run Code Online (Sandbox Code Playgroud)

然后我可以使用

ShowForm(frm, DialogResult.OK | DialogResult.Retry);
Run Code Online (Sandbox Code Playgroud)

C#有Flags的概念,伪代码:

[Flags]
public enum DialogResults { DialogResult.None, DialogResult.OK, DialogResult.Cancel, DialogResult.Abort, DialogResult.Retry, DialogResult.Ignore, DialogResult.Yes, DialogResult.No }
Run Code Online (Sandbox Code Playgroud)

问题不是真正的代码 - Flags不指示编译器创建一组标志.

  • 在一种情况下,类型应该只允许一个值(DialogResult)
  • 在另一种情况下,类型应该允许多个值above(DialogResults)

我怎样才能拥有枚举类型的"集合"

注意:我认为在C#中不可能.如果这就是答案:可以这样说 - 问题得到了回答.

注意:仅仅因为我认为C#语言没有该功能并不意味着它没有该功能 - 我可能还没有找到它.


更新:另一个例子:

假设我有一个枚举:

public enum PatronTier 
{ 
    Gold = 1,      
    Platinum = 2,  
    Diamond = 3,   
    SevenStar = 7  //Yes, seven
}
Run Code Online (Sandbox Code Playgroud)

我想声明一个由这些枚举类型组成的"集合"

public Tournament
{
   public PatronTiers EligibleTiers { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在其他语言中,您将声明:

public PatronTiers = set of PatronTier;
Run Code Online (Sandbox Code Playgroud)

然后我可以使用:

tournament.EligibleTiers = PatronTier.Gold | PatronTier.SevenStar;
Run Code Online (Sandbox Code Playgroud)

C#有Flags的概念,伪代码:

[Flags]
public enum PatronTiers { PatronTier.Gold, PatronTier.Platinum, PatronTier.Diamond, PatronTier.SevenStar }
Run Code Online (Sandbox Code Playgroud)

这个问题不是真正的代码.

我怎样才能拥有枚举类型的"集合"

Ada*_*rth 6

好像你想要一系列的东西.C#中有数组类型,但在编译器支持方面没有任何直接等同于您的示例,最接近的可能DialogResults[]是数组DialogResults.

尝试提供HashSet您允许的项目.HashSet<T>实现ISet<T>,通常最好是针对接口而不是具体类型,特别是对于方法签名:

ShowForm(Form frm, ISet<DialogResults> allowedResults);
Run Code Online (Sandbox Code Playgroud)

然后你可以Contains用来测试物品:

if (allowedResults.Contains(DialogResults.OK))
{
}
Run Code Online (Sandbox Code Playgroud)

有点毫无意义的替代方案:您可以Set<Enum>使用Jon Skeet的Unconstrained Melody实现自己的类型,从调用者的角度为您提供更好的语法,并更接近您的示例.