Wie wird mit ExpressionFunc eine verschachtelte Eigenschaft definiert?

8

Ich habe also einen Code, der eine Eigenschaft auf ein Objekt setzt. Dieser Code stammt aus einer internen Validierungsklasse, die wir in Komponententests verwenden. Also kann der Code etwas wie

geliefert werden %Vor%

Dieser Code wird in einer Unit-Test-Typ-Umgebung verwendet, in der wir dann Aufrufe wie

vornehmen können %Vor%

(Code für Kürze / Komplexität vereinfacht)

Allerdings haben wir aufgrund einiger Refactorings etwas wie:

%Vor%

Wenn dieser Code ausgeführt wird, erhalten wir den Fehler:

  

Das Objekt stimmt nicht mit dem Zieltyp überein.

Ich vermute, dass versucht wird, die Eigenschaft First für BusinessObject anstelle von NameInfo aufzurufen. Wie kann ich meinen Code ändern, um diesen "verschachtelten" Fall zu behandeln?

    
GWLlosa 16.03.2015, 19:01
quelle

2 Antworten

3

So würden Sie normalerweise die Zeichenfolge "ColumnName1.ColumnName2" in einen Lambda-Ausdruck x => x.ColumnName1.ColumnName2 konvertieren:

%Vor%

(kopiert von hier )

    
abatishchev 16.03.2015 19:05
quelle
3

Nachdem Sie uns ein Beispiel gegeben haben, ist es ziemlich einfach. Es wäre sinnlos, den Ausdruck in irgendeiner Weise zu kompilieren, weil wir ihn nicht wiederverwenden können, so dass es die Methode nur verlangsamen würde. Es ist einfacher, die "Kette" der Getter zu durchlaufen und Reflektionen zu nutzen, um auf ihren Wert zuzugreifen. Die Methode, die ich geschrieben habe, unterstützt sowohl Felder (oft als readonly -Felder verwendet) als auch Eigenschaften.

%Vor%

Du benutzt es so:

%Vor%

Beachten Sie, dass SetDeepValue das targetObject nicht benötigt und auch nicht verwendet, weil es in der Kette der Getter entdeckt werden kann:

%Vor%

Hier haben Sie ()=>myCustomer .

Es wäre notwendig gewesen, wenn du in der Form

anrufst %Vor%

Ich gebe Ihnen sogar eine Methode, die dieses zweite Format von Expression verwendet:

%Vor%

Sie können die beiden vergleichen, um die Unterschiede zu sehen.

    
xanatos 17.03.2015 06:31
quelle