如何对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提示让我想到扩展方法)
你需要在课堂上写这个.
就个人而言,我建议将其重新编写为Color(单数)枚举和Colors类.所述Colors然后类可以包括返回枚举的"基团"的方法或性质(即:IEnumerable<Color> LightColors { get { //...)
您可以使用反射。
首先,您必须标记您的类别:
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)
| 归档时间: |
|
| 查看次数: |
6934 次 |
| 最近记录: |