如何分组枚举值?

brg*_*ner 7 c#

如何对Enum值进行分组?
假设我有一个类似的枚举

public enum Colors
  {
    LightBlue,
    LightGreen,
    DarkGreen,
    Black,
    White,
    LightGry,
    Yellow
  }
Run Code Online (Sandbox Code Playgroud)

现在我想定义一些颜色组,例如浅色(LightBlue,LightGreen,White,LightGray,Yellow)和深色(Black,DarkGreen).
所以我可以在我的代码中要求不同地方的小组.
如果我没记错我的Java时间,我可以在Java中为枚举添加方法.我认为这在C#中是不可能的.但也许还有其他方法.

Edit1:当然我可以添加一个带有静态成员的Utility类IsADarkColor(Colors c).但我想在没有额外课程的情况下这样做,因为当我需要这个功能时,我可以忘记相关的课程.

Str*_*ior 12

我可以添加一个带有静态成员的Utility类IsADarkColor(Colors c).但我想在没有额外课程的情况下这样做,因为当我需要这个功能时,我可以忘记相关的课程.

这是扩展方法派上用场的时候:

// Taking Reed Copsey's naming advice
public enum Color
{
    LightBlue,
    LightGreen,
    DarkGreen,
    Black,
    White,
    LightGray,
    Yellow
}

public static class Colors
{
    public static bool IsLightColor(this Color color)
    {
        switch(color){
            case Color.LightBlue:
            case Color.LightGreen:
            case Color.DarkGreen:
            case Color.LightGray:
            return true;
            default: 
            return false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

只要这两个类在同一名称空间中,您就可以看到静态方法,就好像它属于Color类一样:

var color = Color.LightBlue;
if(color.IsLightColor()) {...}
Run Code Online (Sandbox Code Playgroud)

(给@Abdul提示让我想到扩展方法)


Ree*_*sey 5

你需要在课堂上写这个.

就个人而言,我建议将其重新编写为Color(单数)枚举和Colors类.所述Colors然后类可以包括返回枚举的"基团"的方法或性质(即:IEnumerable<Color> LightColors { get { //...)


chu*_*1ty 5

您可以使用反射。
首先,您必须标记您的类别:

public enum Colors
{
    [Category("LightColor")]
    LightBlue,
    [Category("LightColor")]
    LightGreen,
    [Category("DarkColor")]
    DarkGreen,
    [Category("DarkColor")]
    Black,
    [Category("LightColor")]
    White,
    [Category("LightColor")]
    LightGry,
    [Category("LightColor")]
    Yellow
}
Run Code Online (Sandbox Code Playgroud)

然后您应该创建一些辅助类/扩展方法来获取该信息:

 public static string GetCategory(this Colors source)
    {
        FieldInfo fieldInfo = source.GetType().GetField(source.ToString());

        CategoryAttribute attribute = (CategoryAttribute)fieldInfo.GetCustomAttribute(typeof(CategoryAttribute), false);

        return attribute.Category;
    }
Run Code Online (Sandbox Code Playgroud)

最后你可以用 LINQ 做任何你想做的事:

 var permissions = Enum.GetValues(typeof(Colors)).Cast<Colors>()
            .Select(x => new { Category = x.GetCategory(), Value = x.ToString() })
            .GroupBy(x => x.Category)
            .ToDictionary(grp => grp.Key, grp => grp.Select(x => x.Value).ToList());
Run Code Online (Sandbox Code Playgroud)