У меня есть частичный класс, сгенерированный из EF4, которому я назначаю MetadataType
для отображения в форме ASP.NET MVC3 имени элемента управления, и он работает как положено.
Я хотел быиспользуйте тот же DisplayAttribute
, назначенный каждому свойству, чтобы получить отображаемое значение Name
для свойства для другой цели.Мои классы такие:
using Domain.Metadata;
namespace Domain
{
[MetadataType(typeof(ClassAMetada))]
public partial class ClassA
{}
}
namespace Domain.Metadata
{
public class ClassAMetada
{
[Display(Name = "Property 1 Description", Order = 1)]
public Boolean Property1;
[Display(Name = "Property 2 Description", Order = 2)]
public Boolean Property2;
}
}
Я уже видел эти 3 сообщения и попробовал представленные решения:
, но ни один из них не может получить атрибут Name
value;атрибут не найден и поэтому равен null
, поэтому он возвращает пустую строку (3-й вопрос) или имя свойства (1-й вопрос);2-й вопрос был слегка изменен, чтобы обнаружить атрибут, но в результате также появилась пустая строка.
Не могли бы вы помочь мне с этим вопросом?Большое спасибо!
РЕДАКТИРОВАТЬ:
вот код для 2 методов, которые я использую для получения значения атрибута (оба работают отдельно).Оба они очень похожи: первый использует строку с именем свойства, а второй использует выражение lamba.
private static string GetDisplayName(Type dataType, string fieldName)
{
DisplayAttribute attr;
attr = (DisplayAttribute)dataType.GetProperty(fieldName).GetCustomAttributes(typeof(DisplayAttribute), true).SingleOrDefault();
if (attr == null)
{
MetadataTypeAttribute metadataType = (MetadataTypeAttribute)dataType.GetCustomAttributes(typeof(MetadataTypeAttribute), true).FirstOrDefault();
if (metadataType != null)
{
var property = metadataType.MetadataClassType.GetProperty(fieldName);
if (property != null)
{
attr = (DisplayAttribute)property.GetCustomAttributes(typeof(DisplayAttribute), true).SingleOrDefault();
}
}
}
return (attr != null) ? attr.Name : String.Empty;
}
private static string GetPropertyName<T>(Expression<Func<T>> expression)
{
MemberExpression propertyExpression = (MemberExpression)expression.Body;
MemberInfo propertyMember = propertyExpression.Member;
Object[] displayAttributes = propertyMember.GetCustomAttributes(typeof(DisplayAttribute), true);
if (displayAttributes != null && displayAttributes.Length == 1)
return ((DisplayAttribute)displayAttributes[0]).Name;
return propertyMember.Name;
}