Как найти целевое свойство атрибута 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;
}