Не удается получить имя атрибута отображения - PullRequest
3 голосов
/ 27 апреля 2011

У меня есть частичный класс, сгенерированный из 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;
}

1 Ответ

1 голос
/ 27 апреля 2011

Рассматривали ли вы, чтобы ваше отображаемое имя использовалось в ресурсах?Повторно использовать намного проще, чем всю эту магию отражения.

Вы можете просто сделать:

[Display(Name = "Property1Name", ResourceType = typeof(Resources), Order = 1)]
public Boolean Property1;

И добавить файл Resources.resx в свой проект с помощью клавиши Property1Name и "Описание свойства 1" значение.Конечно, вам, вероятно, придется установить доступ к ресурсам по умолчанию от internal до public.

Позже, в других местах вам нужны эти строки, просто позвоните:

string displayName = Domain.Resources.Property1Name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...