Атрибут 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
}
}
}
Как я могу узнать: установлены ли attrs или нет без блока try-catch?
попытаться прочитать исключение вызова свойства .. см. экран отладчика.
но если свойство установлено - проблема исчезает.
... Попробуй методами Get ... Не понимаю в чем дело. Не могли бы вы подать пример. Доступ к свойству происходит через Reflection - и если речь идет о аксессоре объекта атрибута, то у меня нет возможности вызвать его напрямую. (Хотя даже в этом случае возникает ошибка ((System.ComponentModel.DataAnnotations.DisplayAttribute) att rInstance) .Order). Попытка прочитать средства доступа к типу через метод GetAccessors, возвращая тот же метод get_Order (), который вызывает ошибку. p.GetAccessors () [0] .Invoke (attrInstance, null);





Я наконец понял, о чем говорил Лассе Вагстер Карлсен.
Для многих свойств (например, AutoGenerateField) в документации есть замечание:
Do not use this property to access the AutoGenerateField property. Instead, use the GetAutoGenerateField method.
Но почему-то для поля 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;
}
}
Попробуйте использовать методы
Get, похоже, они возвращаютnull, если соответствующее свойство не было присвоено.