Использование Reflection для поиска [XmlAttribute ("IWantThisValueRightHere")] - PullRequest
0 голосов
/ 19 июня 2009

У меня есть класс с несколькими базовыми свойствами ...

[XmlAttribute("MyFirstProperty")]
public string FirstProperty { get; set; }

[XmlAttribute("MySecondProperty")]
public string SecondProperty { get; set; }

Используя Reflection, я могу перечислять через открытые свойства и получать объекты PropertyInfo для каждого из указанных выше свойств ... единственное, что мне сейчас нужно, это способ:

  1. Определить, есть ли у свойства XmlAttribute (я думаю, это работает через PropertyInfo.IsDefined (typeof (XmlAttribute), true), но хотелось бы убедиться)
  2. Получить строковое значение XmlAttribute

Как это сделать?

Ответы [ 3 ]

6 голосов
/ 19 июня 2009
 object[] attribs = myPropertyInfo.GetCustomAttributes(typeof(XmlAttribute),false);
 bool doesPropertyHaveAttrib =attribs.Length > 0; 
 string name = (XmlAttribute)(attribs[0].AttributeName);

Хорошая мысль Джоэла в комментариях. Виноват. Исправлено.

1 голос
/ 10 февраля 2014

Я понимаю, что это старый вопрос. Наткнувшись на ту же самую проблему сегодня, ни одно из предложенных здесь решений не сработало. Особенно видно, как предложено решение Attribute.GetCustomAttributes(typeof(XmlAttribute),false) генерирует исключение, потому что XmlAttribute не является производным от System.Attribute. Вместо этого вы должны проверить на XmlAttributeAttribute.

Для дальнейшего использования это правильный и рабочий способ проверки XmlAttribute с использованием отражения:

PropertyInfo[] objProperties = obj.GetProperties();

foreach (var prop in objProperties)
{
Attribute[] propXmlAttr = Attribute.GetCustomAttributes(prop, typeof(XmlAttributeAttribute), false);
if (propXmlAttr.Length > 0)
     string myAttribute = propValue.ToString());
}
0 голосов
/ 19 июня 2009

Я сейчас использую этот подход:

'Получить свойства

       Dim pi() As PropertyInfo = arguments.SourceObject.GetType.GetProperties(BindingFlags.Instance Or BindingFlags.Static Or BindingFlags.Public Or BindingFlags.GetProperty)

'получить атрибуты для свойств

dim pitem As PropertyInfo = pi (0)

           Dim vobj() As Object = pitem.GetCustomAttributes(GetType(ValidationSettingsBaseAttribute), False)


          Dim attr As ValidationSettingsBaseAttribute= TryCast(vobj(0), ValidationSettingsBaseAttribute)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...