如何在 C# 中具有一组枚举值

本文关键字:枚举 具有一 | 更新日期: 2023-09-27 18:18:03

>假设我有一个枚举:

namespace System.Windows.Forms
{
   public enum DialogResult { None, OK, Cancel, Abort, Retry, Ignore, Yes, No }
}

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

ShowForm(Form frm, DialogResults allowedResults)

在其他语言中,您可以声明:

public DialogResults = set of DialogResult;

然后我可以使用

ShowForm(frm, DialogResult.OK | DialogResult.Retry);

C#有标志的概念,伪代码:

[Flags]
public enum DialogResults { DialogResult.None, DialogResult.OK, DialogResult.Cancel, DialogResult.Abort, DialogResult.Retry, DialogResult.Ignore, DialogResult.Yes, DialogResult.No }

问题在于它不是真正的代码 - Flags 不会指示编译器创建一组标志。

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

如何拥有枚举类型的"集合">

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

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


更新:另一个例子:

假设我有一个枚举:

public enum PatronTier 
{ 
    Gold = 1,      
    Platinum = 2,  
    Diamond = 3,   
    SevenStar = 7  //Yes, seven
}

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

public Tournament
{
   public PatronTiers EligibleTiers { get; set; }
}

在其他语言中,您可以声明:

public PatronTiers = set of PatronTier;

然后我可以使用:

tournament.EligibleTiers = PatronTier.Gold | PatronTier.SevenStar;

C#有标志的概念,伪代码:

[Flags]
public enum PatronTiers { PatronTier.Gold, PatronTier.Platinum, PatronTier.Diamond, PatronTier.SevenStar }

问题在于它不是真正的代码。

如何拥有枚举类型的"集合">

如何在 C# 中具有一组枚举值

似乎你想要一系列东西。C#中有数组类型,但在编译器支持方面没有与您的示例直接等效的东西,最接近的可能是DialogResults[],一个DialogResults数组。

尝试提供您允许的项目HashSetHashSet<T>实现ISet<T>,通常最好使用接口而不是具体类型,尤其是对于方法签名:

ShowForm(Form frm, ISet<DialogResults> allowedResults);

然后,您可以使用Contains来测试项目:

if (allowedResults.Contains(DialogResults.OK))
{
}

有点毫无意义的选择:你总是可以使用Jon Skeet的Unbound Melody来实现你自己的Set<Enum>类型,从调用者的角度给你一个更好的语法,并更接近你的示例。

我不

认为你的意思是使用这样的东西吗?

var DialogResults = Enum.GetValues(typeof(DialogResult));

如果您希望强类型,请使用.Select(dr => (DialogResult)dr).ToArray()

我想你想要这样的东西:

foreach (var item in System.Enum.GetValues(typeof(PatronTier)))
{
    Console.WriteLine(item);
}