Как найти целевое свойство атрибута UIHInt?

У меня есть следующий Attibute на основе UIHInt:

[AttributeUsage(AttributeTargets.Property)]
public class DropDownListAttribute : UIHintAttribute, IMetadataAware
{
    public DropDownListAttribute(string selectListName)
        : base(KnownUiHints.DropDown, KnownPresentationLayers.Mvc, selectListName)
    {
        SelectListName = selectListName;
    }

    public string SelectListName { get; set; }

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.AdditionalValues[KnowMetadataKeys.SelectListName] = SelectListName;
    }
}

Его цель - назначить SelectList для свойства модели представления с одним значением, которое будет выбрано из списка, например:

public class DemoModel: ViewModel
{
    [Required]
    [DropDownList("LanguageSelect")]
    [Display(Name = "Language")]
    public int? LanguageId { get; set; }

    public SelectList LanguageSelect { get; set; }
}

Теперь я работаю с некоторыми очень голберговскими механизмами и моим собственным поставщиком метаданных, но обнаружив, IMetadataAware.OnMetadataCreatedЯ чувствую, что могу упростить это. Прямо сейчас я добавляю SelectListName к метаданным, а затем перепрыгнуть через несколько циклов: а) Получить список выбора в своего рода глобальный словарь и б) получить список выбора из этого словаря при отображении выпадающего списка.

Я хотел бы добавить сам SelectList к метаданным модели в атрибуте, то есть метаданным, локальным для свойства, к которому применяется атрибут, но как мне получить доступ к этому свойству или к его типу?

1 ответ

Пример кода для доступа к атрибутам в Pocos. Существует версия с одним или несколькими атрибутами

пример вызова метода

var MutliAttributeList = MyStatic.GetPocoMultiAttribute<MyAttribute>(typeof(poco),"AttrName");


 public static UAttribute GetPocoAttribute<TPoco, UAttribute>(string attributeName) {
        var result = typeof (TPoco).GetCustomAttributes(true)
                                   .Where(attribute => attribute.GetType()
                                                                .Name == attributeName)
                                   .Cast<UAttribute>()
                                   .FirstOrDefault();
        return result;
    }

public static IEnumerable<UAttribute> GetPocoMultiAttribute<UAttribute>(Type pocoType, string attributeName) {
        var result = pocoType.GetCustomAttributes(true)
                             .Where(attribute => attribute.GetType()
                                                          .Name == attributeName).Cast<UAttribute>().ToList();
        return result;
    }
Другие вопросы по тегам