【问题标题】:Entity Framework Data Annotation "Display Name" of type Enum枚举类型的实体框架数据注释“显示名称”
【发布时间】:2014-05-23 12:04:39
【问题描述】:

有谁知道如何访问枚举类型的“显示名称”数据注释?

我有一个带有显示名称的枚举类型

class enum SomethingType {
  [Display(Name = "Type 1")]
  Type1,
  [Display(Name = "Type 2")]
  Type2
}

以及引用它的模型类

class ModelClass {
  public SomethingType Type {get; set;}
}

如何显示 ModelClass 中值的显示名称?

谢谢。

【问题讨论】:

    标签: c# frameworks entity data-annotations


    【解决方案1】:

    您可以创建一个通用的辅助方法来从这些属性中读取数据。

    public static string GetAttributeValue<T>(this Enum e, Func<T, object> selector) where T : Attribute
        {
    
            var output = e.ToString();
            var member = e.GetType().GetMember(output).First();
            var attributes = member.GetCustomAttributes(typeof(T), false);
    
            if (attributes.Length > 0)
            {
                var firstAttr = (T)attributes[0];
                var str = selector(firstAttr).ToString();
                output = string.IsNullOrWhiteSpace(str) ? output : str;
            }
    
            return output;
        }
    

    例子:

    var x = SomethingType.Type1.GetAttributeValue<DisplayAttribute>(e => e.Name);
    

    .......

    class ModelClass
    {
        public SomethingType Type { get; set; }
    
        public string TypeName
        {
            get { return Type.GetAttributeValue<DisplayAttribute>(attribute => attribute.Name); }
        }
    }
    

    【讨论】:

    • 我很惊讶没有人投票赞成或更好地接受它作为答案。
    【解决方案2】:

    我认为您正在寻找这样的东西:

    class ModelClass
    {
        public SomethingType MyType {get; set;}
    
        public string TypeName {
    
            get
            {
                var enumType = typeof(SomethingType);
                var field = enumType.GetFields()
                           .First(x => x.Name == Enum.GetName(enumType, MyType));
    
                var attribute = field.GetCustomAttribute<Display>();
    
                return attribute.Name;
            }
    
    }
    

    【讨论】:

    • 我喜欢这个,但我仍在等待更好的答案
    【解决方案3】:

    您可以使用反射来访问属性的属性:

    Type = SomethingType.Type2;
    
    var memberInfo = Type.GetType().GetMember(Type.ToString());
    
    if (memberInfo.Any())
    {
        var attributes = memberInfo.First().GetCustomAttributes(typeof(DisplayAttribute), false);
        if (attributes.Any())
        {
            var name = ((DisplayAttribute)attributes.First()).Name;  // Type 2
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多