【问题标题】: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
}
}