2009-06-19 9 views
0

J'ai une classe avec quelques propriétés de base ...aide de la réflexion pour trouver [XmlAttribute (« IWantThisValueRightHere »)]

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

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

aide de la réflexion, je peux énumérer les propriétés publiques et obtenir des objets PropertyInfo pour chaque des propriétés ci-dessus ... la seule chose que je dois est maintenant un moyen de:

  1. détecter si oui ou non la propriété a une XmlAttribute (je pense que cela fonctionne via PropertyInfo.IsDefined (typeof (XmlAttribute), vrai) mais aimerait être sûr)
  2. Récupère la valeur de chaîne de l'attribut XmlAttribute

Comment cela est-il fait?

Répondre

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

Bon point par Joel dans les commentaires. Ma faute. Fixé.

+0

Vous allez devoir faire un peu de casting sur cette dernière ligne. System.Object n'a pas de propriété AttributeName. –

+0

Le plus simple "fix" est d'utiliser Attribute [] attribs = Attribute.GetAttributes (myPropertyInfo, typeof (XmlAttribute)); –

0

J'utilise actuellement cette approche:

'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 les attributs pour les propriétés

pitem dim Comme PropertyInfo = pi (0)

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


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

Je réalise que c'est une vieille question. Trébuchant sur le même problème aujourd'hui, aucune des solutions fournies ici n'a fonctionné. Notamment en voyant comment la solution proposée Attribute.GetCustomAttributes(typeof(XmlAttribute),false) déclenche une exception, car XmlAttribute n'est pas dérivé de System.Attribute. Au lieu de cela, vous devriez vérifier XmlAttributeAttribute.

Pour référence ultérieure, c'est la bonne manière et de travailler pour vérifier XmlAttribute utilisant 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()); 
} 
Questions connexes