C# “实体框架数据注释”;显示名称";枚举类型

C# “实体框架数据注释”;显示名称";枚举类型,c#,frameworks,entity,data-annotations,C#,Frameworks,Entity,Data Annotations,有人知道如何访问枚举类型的“显示名称”数据注释吗 我有一个显示名称的枚举类型 class enum SomethingType { [Display(Name = "Type 1")] Type1, [Display(Name = "Type 2")] Type2 } 以及引用它的模型类 class ModelClass { public SomethingType Type {get; set;} } 如何在ModelClass中显示值的显示名称 谢谢。您可以使用反射来

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

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

class enum SomethingType {
  [Display(Name = "Type 1")]
  Type1,
  [Display(Name = "Type 2")]
  Type2
}
以及引用它的模型类

class ModelClass {
  public SomethingType Type {get; set;}
}
如何在ModelClass中显示值的显示名称


谢谢。

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

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
    }
}

我想你正在寻找这样的东西:

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;
        }

}
class模型类
{
公共SomethingType MyType{get;set;}
公共字符串类型名{
得到
{
var enumType=typeof(SomethingType);
var field=enumType.GetFields()
.First(x=>x.Name==Enum.GetName(enumType,MyType));
var attribute=field.GetCustomAttribute();
返回属性.Name;
}
}

您可以创建一个从这些属性读取数据的通用帮助器方法

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;
    }
public静态字符串GetAttributeValue(此枚举e,Func选择器),其中T:Attribute
{
var输出=e.ToString();
var member=e.GetType().GetMember(output.First();
var attributes=member.GetCustomAttributes(typeof(T),false);
如果(attributes.Length>0)
{
var firstAttr=(T)属性[0];
var str=选择器(firstAttr).ToString();
output=string.IsNullOrWhiteSpace(str)?output:str;
}
返回输出;
}
例如:

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

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

    public string TypeName
    {
        get { return Type.GetAttributeValue<DisplayAttribute>(attribute => attribute.Name); }
    }
}
class模型类
{
公共SomethingType类型{get;set;}
公共字符串类型名
{
获取{return Type.GetAttributeValue(attribute=>attribute.Name);}
}
}

我喜欢这个,但我仍在等待更好的答案。我很惊讶没有人投票支持这个答案,或者更好的是,没有人接受它作为答案。