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?
So würden Sie normalerweise die Zeichenfolge "ColumnName1.ColumnName2"
in einen Lambda-Ausdruck x => x.ColumnName1.ColumnName2
konvertieren:
(kopiert von hier )
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.
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:
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:
Sie können die beiden vergleichen, um die Unterschiede zu sehen.
Tags und Links .net c# reflection expression-trees