Utilisation de la réflexion pour définir une propriété d'une propriété d'un objet

StackOverflow https://stackoverflow.com/questions/1402479

  •  05-07-2019
  •  | 
  •  

Question

J'ai deux cours.

public class Class1 {
   public string value {get;set;}
}

public class Class2 {
   public Class1 myClass1Object {get;set;}
}

J'ai un objet de type Class2. Je dois utiliser la réflexion sur Class2 pour définir la propriété value. En d’autres termes, si je le faisais sans réflexion, voici comment je procéderais:

Class2 myObject = new Class2();
myObject.myClass1Object.value = "some value";

Existe-t-il un moyen de procéder de la manière indiquée ci-dessus tout en utilisant la réflexion pour accéder à la propriété " myClass1Object.value " ?

Merci d'avance.

Était-ce utile?

La solution

En gros, divisez-le en deux accès de propriété. Tout d'abord, vous obtenez la propriété myClass1Object , puis vous définissez la propriété valeur sur le résultat.

Évidemment, vous devez choisir le format de votre nom et le séparer - par exemple. par des points. Par exemple, cela devrait faire une profondeur arbitraire de propriétés:

public void SetProperty(object source, string property, object target)
{
    string[] bits = property.Split('.');
    for (int i=0; i < bits.Length - 1; i++)
    {
         PropertyInfo prop = source.GetType().GetProperty(bits[i]);
         source = prop.GetValue(source, null);
    }
    PropertyInfo propertyToSet = source.GetType()
                                       .GetProperty(bits[bits.Length-1]);
    propertyToSet.SetValue(source, target, null);
}

Certes, vous voudrez probablement un peu plus de vérification d'erreur que cela:)

Autres conseils

Je cherchais des réponses au cas où Obtenir une valeur de propriété, lorsque le nom de la propriété est donné, mais que le niveau d’imbrication de la propriété n’est pas connu.

Par exemple. si l'entrée est "valeur" au lieu de fournir un nom de propriété complet, tel que "myClass1Object.value".

Vos réponses ont inspiré ma solution récursive ci-dessous:

public static object GetPropertyValue(object source, string property)
{
    PropertyInfo prop = source.GetType().GetProperty(property);
    if(prop == null)
    {
      foreach(PropertyInfo propertyMember in source.GetType().GetProperties())
      { 
         object newSource = propertyMember.GetValue(source, null);
         return GetPropertyValue(newSource, property);
      }
    }
    else
    {
       return prop.GetValue(source,null);
    }
    return null;
}
   public static object GetNestedPropertyValue(object source, string property)
    {
        PropertyInfo prop = null;
        string[] props = property.Split('.');

        for (int i = 0; i < props.Length; i++)
        {
            prop = source.GetType().GetProperty(props[i]);
            source = prop.GetValue(source, null);
        }
        return source;
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top