我有一个包含大量项目的现有枚举.
我也有现有的代码用这个枚举做某些事情.
我现在想要一种只查看子集枚举成员的方法.我正在寻找的是一种将我的枚举分成小组的方法.我需要保留每个成员的(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)
如果枚举没有显式值,请给它们一个并使用标志定义“分组”:
[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.GetValues
和HasFlag
获取给定“分组”的值:
var group1 = Enum.GetValues(typeof(MySuperEnumGroup))
.Cast<MySuperEnumGroup>()
.Where(value => value.HasFlag(MySuperEnumGroup.Group1))
.ToArray();
Run Code Online (Sandbox Code Playgroud)
最后,我不得不重写大部分代码,但得出了以下“技巧”:
我废弃了 C# 枚举并在常规类中使用静态成员。此类被制成单例并在应用程序启动时初始化。
我的静态成员的构造函数可以引用另一个静态成员作为“父级”。
接下来,我的 init 方法使用反射来遍历每个静态成员并根据多个属性对它们进行索引。这些索引存储在哈希表中,哈希表也是单例的成员。
我因此得到:
一个单例对象:
我的 init 方法进行了大量的验证。如果构建了无效(例如重复)的静态成员,您将在应用程序启动时收到运行时错误。
显然这是一个相当大的黑客,但我对此很满意。