2009-06-19 13 views
0

У меня есть класс с несколькими основными свойствами ...с помощью отражения, чтобы найти [XmlAttribute («IWantThisValueRightHere»)]

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

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

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

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

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

ответ

6
object[] attribs = myPropertyInfo.GetCustomAttributes(typeof(XmlAttribute),false); 
bool doesPropertyHaveAttrib =attribs.Length > 0; 
string name = (XmlAttribute)(attribs[0].AttributeName); 

Хороший отзыв Joel в комментариях. Виноват. Исправлена.

+0

Вы будете иметь, чтобы сделать некоторые кастинг на этой последней строке. System.Object не имеет свойства AttributeName. –

+0

Простейшим «исправлением» является использование атрибута [] attribs = Attribute.GetAttributes (myPropertyInfo, typeof (XmlAttribute)); –

0

Я в настоящее время использую этот подход:

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

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

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

тусклого pitem Как PropertyInfo = р (0)

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


      Dim attr As ValidationSettingsBaseAttribute= TryCast(vobj(0), ValidationSettingsBaseAttribute) 
1

Я понимаю, что это старый вопрос. Наткнувшись на ту же проблему сегодня, ни одно из предложенных здесь решений не сработало. Особенно видя, как предлагаемое решение 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()); 
} 
Смежные вопросы