2010-06-24 5 views
5

Je veux récupérer un PropertyInfo, Voici le code:Comment obtenir des propriétés imbriquées

string propertyName="Text"; 
PropertyInfo pi = control.GetType().GetProperty(propertyName); 

il fonctionne très bien, mais si je veux récupérer les propriétés imbriquées, il retourne null:

string propertyName="DisplayLayout.Override.RowSelectors"; 
PropertyInfo pi = control.GetType().GetProperty(propertyName); 

Est il n'y a aucun moyen d'obtenir des propriétés imbriquées?

Cordialement,

Florian

Edit: J'ai un nouveau problème maintenant, je veux obtenir une propriété qui est un tableau:

string propertyName="DisplayLayout.Bands[0].Columns"; 
PropertyInfo pi = control.GetType().GetProperty(propertyName) 

Merci

Répondre

7

Oui:

public PropertyInfo GetProp(Type baseType, string propertyName) 
{ 
    string[] parts = propertyName.Split('.'); 

    return (parts.Length > 1) 
     ? GetProp(baseType.GetProperty(parts[0]).PropertyType, parts.Skip(1).Aggregate((a,i) => a + "." + i)) 
     : baseType.GetProperty(propertyName); 
} 

Appelée:

PropertyInfo pi = GetProp(control.GetType(), "DisplayLayout.Override.RowSelectors"); 

Recursion pour la victoire!

+0

Merci! Je veux savoir comment obtenir une propriété via un indexeur: string propertyName = "DisplayLayout.Bands [0] .Columns"; PropertyInfo pi = control.GetType(). GetProperty (propertyName); – Florian

3

Juste faites de même sur le PropertyType que vous venez de recevoir pour la propriété (et répétez aussi souvent que nécessaire):

PropertyInfo property = GetType().GetProperty(propertyName); 
PropertyInfo nestedProperty = property.PropertyType.GetProperty(nestedPropertyName) 
+0

Oui, j'ai oublié le bit PropertyType dans ma réponse. –

0

Vous pouvez le faire, mais vous devez faire la « chose ensemble » pour chaque niveau, ce qui signifie:

  • obtenir la propriété de votre type d'objet
  • Obtenez le type de cette propriété
  • Rincer et répéter :)
Questions connexes