Проверьте, установлено ли свойство атрибута без try-catch; - PullRequest
0 голосов
/ 05 октября 2018

System.ComponentModel.DataAnnotations.DisplayAttribute имеет свойства (такие как AutoGenerateField, AutoGenerateFilter, Order).Если какой-либо из этих атрибутов не установлен, при попытке чтения произойдет ошибка.

object valAttrProp ;
var atProp = attrInstance.GetType().GetProperties();

foreach (var propInfo in atProp)
{
   if (propInfo.CanRead )
   {
       try
       {
           // all bottom lines generate an exception... 
           // valAttrProp = propInfo.GetGetMethod().Invoke(attrInstance,null);  
           // valAttrProp = valAttrProp.GetAccessors()[0].Invoke(attrInstance, null);
           // even with direct accessor:
           // valAttrProp = ((System.ComponentModel.DataAnnotations.DisplayAttribute)attrInstance).Order;

           valAttrProp = propInfo.GetValue(attrInstance);

       }
       catch 
       {
           valAttrProp = null;
       }

       if (valAttrProp != null)
       {    
          // ...proccessing
       }
   }
}

attrInstance в отладчике

Как узнать: являются ли атрибутыустановить или нет без блока try-catch?

1 Ответ

0 голосов
/ 08 октября 2018

Я, наконец, понял, о чем говорил Лассе Вогстер Карлсен.

Для многих свойств (например, AutoGenerateField) в документации есть замечание:

Неиспользуйте это свойство для доступа к свойству AutoGenerateField.Вместо этого используйте метод GetAutoGenerateField.

Но по какой-то причине такого примечания для поля Order нет, однако мне кажется, что в таком случае было бы логично разместитьссылка на соответствующий метод в поле GetGetMethod класса PropertyInfo.Но по какой-то причине есть метод get_PropName (вероятно, get-accessor?).Я хотел бы получить через Reflection ссылку на нужный метод,

В противном случае решение плохое:

object val = null;

// bad line
var getMethogInfo = attrInstance.GetType().GetMethod("Get" + propInfo.Name);

if (getMethogInfo != null)
{
    val = getMethogInfo.Invoke(attrInstance, null);
}
else
{
    try
    {
       val = attrInstance.GetValue(at);
    }
    catch
    {
       val = null;
    }
}
...