如何获取枚举的属性[重复]

Posted

技术标签:

【中文标题】如何获取枚举的属性[重复]【英文标题】:How to get attributes of enum [duplicate] 【发布时间】:2012-11-09 12:55:49 【问题描述】:

可能重复:Getting attributes of Enum’s value

这是我的课:

[AttributeUsage(AttributeTargets.Field)]
public sealed class LabelAttribute : Attribute


    public LabelAttribute(String labelName)
    
        Name = labelName;
    

    public String Name  get; set; 


我想获取属性的字段:

public enum ECategory

    [Label("Safe")]
    Safe,
    [Label("LetterDepositBox")]
    LetterDepositBox,
    [Label("SavingsBookBox")]
    SavingsBookBox,

【问题讨论】:

【参考方案1】:

读取ECategory.Safe Label属性值:

var type = typeof(ECategory);
var info = type.GetMember(ECategory.Safe.ToString());
var attributes = info[0].GetCustomAttributes(typeof(LabelAttribute), false);
var label = ((LabelAttribute)attributes[0]).Name;

【讨论】:

【参考方案2】:

你可以创建一个扩展:

public static class CustomExtensions
  
    public static string GetLabel(this ECategory value)
    
      Type type = value.GetType();
      string name = Enum.GetName(type, value);
      if (name != null)
      
        FieldInfo field = type.GetField(name);
        if (field != null)
        
          LabelAttribute attr = Attribute.GetCustomAttribute(field, typeof(LabelAttribute )) as LabelAttribute ;
          if (attr != null)
          
            return attr.Name;
          
        
      
      return null;
    
  

那么你可以这样做:

var category = ECategory.Safe;    
var labelValue = category.GetLabel();

【讨论】:

我认为您在函数中缺少参数名称【参考方案3】:
var fieldsMap = typeof(ECategory).GetFields()
    .Where(fi => fi.GetCustomAttributes().Any(a => a is LabelAttribute))
    .Select(fi => new
    
        Value = (ECategory)fi.GetValue(null),
        Label = fi.GetCustomAttributes(typeof(LabelAttribute), false)
                .Cast<LabelAttribute>()
                .Fist().Name
    )
    .ToDictionary(f => f.Value, f => f.Label);

之后,您可以像这样检索每个值的标签:

var label = fieldsMap[ECategory.Safe];

【讨论】:

以上是关于如何获取枚举的属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在枚举中获取枚举值的 int [重复]

Swift:枚举编码如何获取原始值[重复]

如何从 EventLogEntryType 枚举中获取 int 值 [重复]

如何通过传入枚举值和属性类型来获取枚举的自定义属性?

如何获取枚举的自定义属性值?

如何通过 MVC Razor 代码获取枚举成员的显示名称属性?