C# - 通过属性获取所有枚举值

3
我有以下枚举类型:
public enum KodEnum
{
    [EnumType(EnumType = "Task")]
    TaskTab,
    [EnumType(EnumType = "Task")]
    TaskReason,
    [EnumType(EnumType = "Action")]
    ActionTab,
    [EnumType(EnumType = "Action")]
    ActionReason
}

public class EnumTypeAttribute : Attribute
{
    public string EnumType { get; set; }
}

我希望获得所有EnumType为"Task"的枚举列表。

我该怎么做?


1
为什么不定义两个枚举?一个用于Tab或Reason,另一个用于Action或Task。 - undefined
在这种情况下,你是对的,但这只是我项目中的一个小例子。在这个枚举中,我有大约60个值,在某些特定情况下,我并不需要全部使用它们。 - undefined
3个回答

9
像这样的东西应该可以帮助你入门...
var enumValues = (from member in typeof(KodEnum).GetFields()
                  let att = member.GetCustomAttributes(false)
                                  .OfType<EnumTypeAttribute>()
                                  .FirstOrDefault()
                  where att != null && att.EnumType == "Task"
                  select member.GetValue(null))
                 .Cast<KodEnum>()
                 .ToList();

如果您想要整数值,只需进行强制类型转换:

var enumValues = (from member in typeof(KodEnum).GetFields()
                  let att = member.GetCustomAttributes(false)
                                  .OfType<EnumTypeAttribute>()
                                  .FirstOrDefault()
                  where att != null && att.EnumType == "Task"
                  select (int)member.GetValue(null))
                 .ToList();

并且全lambda解决方案:

        var enumValues = typeof(KodEnum)
            .GetFields()
            .Select(x => new 
                { 
                    att = x.GetCustomAttributes(false)
                             .OfType<EnumTypeAttribute>()
                             .FirstOrDefault(), 
                    member = x 
                })
            .Where(x => x.att != null && x.att.EnumType == "Task")
            .Select(x => (int)x.member.GetValue(null))
            .ToList();

这个给我枚举的名称,我想要值,比如0、1、2之类的。 - undefined
这个可以工作,你能否只使用lambda表达式来转换它,而不是使用所有的from、select和where语句? - undefined

0
你可以这样做:
var result = Enum.GetValues(typeof(KodEnum)).OfType<KodEnum>()  
                 .Where(x=>x.EnumType() == "Task");

这是EnumType扩展方法的实现:
public static class EnumExtensions
{
   public static string EnumType(this Enum value)  
   {  
       FieldInfo field = value.GetType().GetField(value.ToString());  

       EnumTypeAttribute attribute  
               = Attribute.GetCustomAttribute(field, typeof(EnumTypeAttribute ))  
                   as EnumTypeAttribute;  

       return attribute == null ? value.ToString() : attribute.EnumType ;  
   }  
}  

-1

关键词是反射:

你尝试过类似这样的东西吗?

Enum.GetValues(typeof(KodEnum))
    .OfType<KodEnum>()
    .Where(o => o.GetType()
        .GetCustomAttributes(typeof(EnumTypeAttribute), false)
        .OfType<EnumTypeAttribute>()
        .FirstOrDefault()
        .EnumType == "Task");

这会导致NullReferenceException,因为你在KodEnum类型上调用了GetCustomAttributes,而不是它的成员上。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接