2010-04-22 14 views
12

Was ist die beste Vorgehensweise in C#?C# - Rekursive/Reflection-Eigenschaftswerte

string propPath = "ShippingInfo.Address.Street"; 

Ich habe einen Eigenschaftspfad wie der oben von einer Mapping-Datei gelesen. Ich muss in der Lage sein, das Order-Objekt nach dem Wert des folgenden Codes zu fragen.

this.ShippingInfo.Address.Street 

Balancing Performance mit Eleganz. Alle Objektdiagrammbeziehungen sollten eins zu eins sein. Teil 2: Wie schwer wäre es, die Fähigkeit hinzuzufügen, um die erste zu bekommen, wenn es eine Liste <> oder etwas ähnliches ist.

Antwort

25

Vielleicht so etwas?

string propPath = "ShippingInfo.Address.Street"; 

object propValue = this; 
foreach (string propName in propPath.Split('.')) 
{ 
    PropertyInfo propInfo = propValue.GetType().GetProperty(propName); 
    propValue = propInfo.GetValue(propValue, null); 
} 

Console.WriteLine("The value of " + propPath + " is: " + propValue); 

Oder, wenn Sie LINQ bevorzugen, könnten Sie dies stattdessen versuchen. (Obwohl ich persönlich die Nicht-LINQ-Version bevorzuge.)

string propPath = "ShippingInfo.Address.Street"; 

object propValue = propPath.Split('.').Aggregate(
    (object)this, 
    (value, name) => value.GetType().GetProperty(name).GetValue(value, null)); 

Console.WriteLine("The value of " + propPath + " is: " + propValue); 
+0

+1, weil das Codebeispiel kürzer ist als seine Textbeschreibung * g * – Foxfire

+0

Ich mag es. Ich stehe über die Schwierigkeiten, dies auszudrücken, hinaus.Coole LINQ-Implementierung auch. – kmontgom

1

Klingt wie eine Reihe von verschachtelten Eigenschaft Anrufungen:

Klasse X hat eine Eigenschaft genannt Versandinfo; Der Typ, der von ShippingInfo dargestellt wird, hat eine Eigenschaft Address; Der Typ Address hat eine Eigenschaft namens Street.

Also, vorausgesetzt, dass Sie die entsprechende Instanz der Klasse X kennen, auf den Betrieb: ("". ToCharArray())

  • tokenize der Zeichenfolge über String.split in einen String [], oder etwas wie der
  • Start mit dem bekannten Beispiel von X
  • Verwendung Reflexion der Method für die Versandinfo Getter
  • Verwendung Reflexion zu erhalten, um den Typen zurück von Versandinfo get()
  • Rufen Sie das erhalten Getter Reflexion
  • mit dem Rückgabewert der Versandinfo get() und die Art der Rückkehr mit:
    • erhält die Method für die Adresse Getter in dem zurückgegebenen Typ .....

und so weiter. Du bekommst das Bild.

Scheint ein bisschen lang und langweilig, und es ist. Aber so würden Sie es durch Reflexion tun.

Ich frage mich, ob es möglich ist, das gleiche mit LINQ to Objects zu tun?

Die Antwort zu Teil 2 beinhaltet das Abrufen des Anfangswerts von X aus Ihrer Liste <>.

+0

Können Sie das bitte umschreiben? Nicht sehr leicht zu verstehen - zu viele Worte :) – Nayan

+0

Nein. Wenn überhaupt, ist es zu kurz und kurz von Details. Das ist das Problem mit etwas wie Reflexion, es gibt viele Schritte und jeder Schritt erfordert spezifisches Wissen. Es tut uns leid. – kmontgom