Frage

Ich habe zwei Klassen.

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

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

Ich habe ein Objekt vom Typ Class2 bekommt. Ich brauche Reflexion über Klasse 2 verwenden, um den Wert Eigenschaft zu setzen ... das heißt, wenn ich es ohne Reflexion zu tun wurde, das ist, wie ich es gehen würde:

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

Gibt es eine Möglichkeit, die oben zu tun, während Reflexion über die Eigenschaft „myClass1Object.value“ zugreifen?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

aufgeteilt Im Grunde ist es in zwei Eigenschaft zugreift. Zuerst get die myClass1Object Eigenschaft, dann Sie gesetzt die value Eigenschaft auf dem Ergebnis.

Natürlich müssen Sie nehmen, was Format, das Sie den Eigenschaftsnamen haben in und teilen Sie es heraus - z.B. durch Punkte. Zum Beispiel soll eine beliebige Tiefe von Eigenschaften tun:

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

Allerdings werden Sie wahrscheinlich etwas mehr Fehler wollen Überprüfung als das:)

Andere Tipps

Ich war auf der Suche nach Antworten auf den Fall, dass eine Eigenschaft Wert zu erhalten, wenn der Name der Eigenschaft ist gegeben, aber die Verschachtelungsebene der Immobilie ist nicht bekannt.

Eg. wenn der Eingang „Wert“ statt einen vollständig qualifizierten Eigenschaftsnamen der Bereitstellung wie „myClass1Object.value“.

Ihre Antworten inspiriert meine rekursive Lösung unter:

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;
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top