C#中的枚举子集或子组

srm*_*ark 21 c# enums

我有一个包含大量项目的现有枚举.

我也有现有的代码用这个枚举做某些事情.

我现在想要一种只查看子集枚举成员的方法.我正在寻找的是一种将我的枚举分成小组的方法.我需要保留每个成员的(int)值,并且我需要保留在需要时查看所有枚举成员的能力.

我唯一能想到的就是为每个子枚举创建一个新的枚举,它只包含我想要的项目使用相同的名称和值.

这有效但违反了整个无重复原则.

我不希望任何人有更好的选择,但我想我会问,以防有人有一个奇特的伎俩给我看.

谢谢,一如既往.

小智 13

我会用这个(至少在VB.NET中工作)

enum MySuperEnumGroup 
{ 
  Group1Item1, 
  Group1Item2, 
  Group1Item3, 

  Group2Item1, 
  Group2Item2, 
  Group2Item3, 

  Group3Item1, 
  Group3Item2, 
  Group3Item3, 
} 

enum MySubEnumGroup 
{
Group2Item1 = MySuperEnumGroup.Group2Item1 
Group3Item1 = MySuperEnumGroup.Group3Item1 
Group3Item3 = MySuperEnumGroup.Group3Item3
}
Run Code Online (Sandbox Code Playgroud)

然后在需要时做某种CType.


Jef*_*tes 10

您可以使用枚举定义值,但然后通过静态类中的常量引用它们,这样您的开发人员就不会被大型枚举所覆盖.你可以有:

enum MySuperEnumGroup
{
  Group1Item1,
  Group1Item2,
  Group1Item3,

  Group2Item1,
  Group2Item2,
  Group2Item3,

  Group3Item1,
  Group3Item2,
  Group3Item3,
}

static class MySuperEnumGroup_Group1
{
  public const MySuperEnumGroup Item1 = MySuperEnumGroup.Group1Item1;
  public const MySuperEnumGroup Item2 = MySuperEnumGroup.Group1Item2;
  public const MySuperEnumGroup Item3 = MySuperEnumGroup.Group1Item3;
}

static class MySuperEnumGroup_Group2
{
  public const MySuperEnumGroup Item1 = MySuperEnumGroup.Group2Item1;
  public const MySuperEnumGroup Item2 = MySuperEnumGroup.Group2Item2;
  public const MySuperEnumGroup Item3 = MySuperEnumGroup.Group2Item3;
}

//etc.
Run Code Online (Sandbox Code Playgroud)


Mat*_*don 5

如果枚举没有显式值,请给它们一个并使用标志定义“分组”:

[Flags]
enum MySuperEnumGroup
{
    Group1 = 1 << 0,
    Group2 = 1 << 1,
    Group3 = 1 << 2,

    Group1Item1 = 1 << 10 | Group1,
    Group1Item2 = 1 << 11 | Group1,
    Group1Item3 = 1 << 12 | Group1,

    Group2Item1 = 1 << 13 | Group2,
    Group2Item2 = 1 << 14 | Group2,
    Group2Item3 = 1 << 15 | Group2,

    Group3Item1 = 1 << 16 | Group3,
    Group3Item2 = 1 << 17 | Group3,
    Group3Item3 = 1 << 18 | Group3,
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用Enum.GetValuesHasFlag获取给定“分组”的值:

var group1 = Enum.GetValues(typeof(MySuperEnumGroup))
                 .Cast<MySuperEnumGroup>()
                 .Where(value => value.HasFlag(MySuperEnumGroup.Group1))
                 .ToArray();
Run Code Online (Sandbox Code Playgroud)


srm*_*ark 3

最后,我不得不重写大部分代码,但得出了以下“技巧”:

我废弃了 C# 枚举并在常规类中使用静态成员。此类被制成单例并在应用程序启动时初始化。

我的静态成员的构造函数可以引用另一个静态成员作为“父级”。

接下来,我的 init 方法使用反射来遍历每个静态成员并根据多个属性对它们进行索引。这些索引存储在哈希表中,哈希表也是单例的成员。

我因此得到:

一个单例对象:

  • 具有可以在设计时轻松访问的静态成员。
  • 可以在运行时用于查找某些静态成员(基于“组”和其他属性)。

我的 init 方法进行了大量的验证。如果构建了无效(例如重复)的静态成员,您将在应用程序启动时收到运行时错误。

显然这是一个相当大的黑客,但我对此很满意。