0 votes

Utilisation de Reflection pour trouver [XmlAttribute("IWantThisValueRightHere")].

J'ai une classe avec quelques propriétés de base...

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

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

En utilisant Reflection, je peux énumérer les propriétés publiques et obtenir des objets PropertyInfo pour chacune des propriétés ci-dessus... la seule chose dont j'ai besoin maintenant, c'est d'un moyen de :

  1. Détecter si la propriété possède ou non un XmlAttribute (je pense que cela fonctionne via PropertyInfo.IsDefined(typeof(XmlAttribute), true) mais j'aimerais m'en assurer)
  2. Obtenir la valeur de la chaîne de caractères de l'attribut XmlAttribute

Comment cela se passe-t-il ?

6voto

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

Bonne remarque de Joel dans les commentaires. C'est ma faute. Corrigé.

0voto

eschneider Points 2125

C'est l'approche que j'utilise actuellement :

Obtenir les propriétés

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

'obtenir des attributs pour les propriétés

dim pitem As PropertyInfo=pi(0)

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

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

0voto

pKami Points 72

Je me rends compte qu'il s'agit d'une vieille question. Je suis tombé sur le même problème aujourd'hui et aucune des solutions proposées ici n'a fonctionné. D'autant plus que la solution proposée Attribute.GetCustomAttributes(typeof(XmlAttribute),false) lance une exception, car XmlAttribute n'est pas dérivé de System.Attribute. Au lieu de cela, vous devez vérifier la présence de XmlAttributeAttribute .

Pour référence future, voici la manière correcte et opérationnelle de vérifier la présence d'un attribut XmlAttribute à l'aide de la réflexion :

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());
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X