2010-09-08 5 views
2

Je voulais savoir comment obtenir la valeur de la propriété en C#, mais cette propriété est d'un autre type.C# Réflexion sur les propriétés imbriquées d'une classe

public class Customer 
{ 
    public string Name {get; set;} 
    public string Lastname {get; set;} 
    public CustomerAddress Address {get; set;} 
} 

Je suis en mesure d'obtenir les valeurs de propriété de nom et LastName mais je ne reçoivent pas tout à fait comment obtenir la valeur de CustomerAddress.City.

C'est ce que j'ai jusqu'à maintenant.

public object GetPropertyValue(object obj, string property) 
{ 
    if (string.IsNullOrEmpty(property)) 
    return new object { }; 

    PropertyInfo propertyInfo = obj.GetType().GetProperty(property); 
    return propertyInfo.GetValue(obj, null); 
} 

Ensuite, utilisez cette méthode dans une instruction LINQ.

var cells = (from m in model 
         select new 
         { 
          i = GetPropertyValue(m, key), 
          cell = from c in columns 
           select reflection.GetPropertyValue(m, c) 
        }).ToArray(); 

Je n'ai donc aucune valeur pour CustomerAddress.

Toute aide sera grandement appréciée.

**** **** MISE A JOUR

Voici comment je réussi à le faire.

public object GetNestedPropertyValue(object obj, string property) 
     { 
      if (string.IsNullOrEmpty(property)) 
       return string.Empty; 

      var propertyNames = property.Split('.'); 

      foreach (var p in propertyNames) 
      { 
       if (obj == null) 
        return string.Empty; 

       Type type = obj.GetType(); 
       PropertyInfo info = type.GetProperty(p); 
       if (info == null) 
        return string.Empty; 

       obj = info.GetValue(obj, null); 

      } 

      return obj; 
     } 
+0

Que diriez-vous de définir la valeur d'une propriété nichée? (Même que celui-ci, mais pour info.SetValue ...)? – Denis

Répondre

3

Tout d'abord, si vous voulez obtenir la valeur de CustomerAddress.City, vous ne serez jamais l'obtenir. CustomerAddress est le type, pas le nom de la propriété. Vous voulez obtenir Address.City.

Cela dit, votre GetPropertyValue n'est pas configuré pour faire ce que vous voulez.

Essayez de diviser le nom par les points:

var propertyNames = property.split('.');

Maintenant, vous avez une liste des noms de propriétés {"Address", "City"}

Ensuite, vous pouvez parcourir ces noms de propriétés, un par un, appeler GetPropertyValue récursivement.

Cela devrait le faire :)

+0

Merci qui a résolu le problème, je n'ai pas pensé à la récursivité. –

0

@ Michael -> la partie inversée ;-)

public static void SetNestedPropertyValue(object obj, string property,object value) 
     { 
      if (obj == null) 
       throw new ArgumentNullException("obj"); 

      if (string.IsNullOrEmpty(property)) 
       throw new ArgumentNullException("property"); 

      var propertyNames = property.Split('.'); 

      foreach (var p in propertyNames) 
      { 

       Type type = obj.GetType(); 
       PropertyInfo info = type.GetProperty(p); 
       if (info != null) 
       { 
        info.SetValue(obj, value); 
        return; 
       } 

      } 

      throw new KeyNotFoundException("Nested property could not be found."); 
     } 
+0

Ceci est complètement inutile, il n'a même pas une simple Typeconversion. En outre, il ne créera pas une nouvelle instance des objets parents. Il y aura une référence nulle sur la deuxième itération dans le foreach. Cela ne fonctionne pas du tout, seulement pour les chaînes et seulement si ce n'est pas un type complexe. –

Questions connexes