Erstellen eines Property-Setter-Delegaten
Ich haben erstellt Methoden für die Konvertierung einer Eigenschaft lambda Delegierter:
public static Delegate MakeGetter<T>(Expression<Func<T>> propertyLambda)
{
var result = Expression.Lambda(propertyLambda.Body).Compile();
return result;
}
public static Delegate MakeSetter<T>(Expression<Action<T>> propertyLambda)
{
var result = Expression.Lambda(propertyLambda.Body).Compile();
return result;
}
Diese Arbeit:
Delegate getter = MakeGetter(() => SomeClass.SomeProperty);
object o = getter.DynamicInvoke();
Delegate getter = MakeGetter(() => someObject.SomeProperty);
object o = getter.DynamicInvoke();
aber diese wird nicht kompilieren:
Delegate setter = MakeSetter(() => SomeClass.SomeProperty);
setter.DynamicInvoke(new object[]{propValue});
Delegate setter = MakeSetter(() => someObject.SomeProperty);
setter.DynamicInvoke(new object[]{propValue});
Den MakeSetter Linien ausfallen, mit "Der Typ der Argumente nicht entnommen werden kann, die aus der Verwendung. Versuchen Sie, den Typ der Argumente ausdrücklich."
Ist, was ich versuche zu tun möglich? Vielen Dank im Voraus.
InformationsquelleAutor der Frage Jim C | 2010-05-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
Expression
- API unterstützt diese Option .NET 4.0, aber leider ist der C# - compiler fügt keine extra-Süßigkeiten zu unterstützen. Aber die gute Nachricht ist, dass Sie trivial einen "get" - Ausdruck (der C# - compiler kann schreiben) und neu zu schreiben es als "set" Ausdruck.Und noch besser, wenn Sie nicht haben .NET 4.0, es gibt immer noch mindestens zwei andere Möglichkeiten, ausführen von "set" über einen Ausdruck geschrieben, als ein "get".
Hier sind Sie alle, zur info:
InformationsquelleAutor der Antwort Marc Gravell
Als pro meine Kommentare - da links gehen tot - ich habe den vollständigen code als eine Antwort auf die Frage. JA, es ist möglich, das zu tun, was der OP fordert. und hier ist ein kleines Juwel von Nick vorführt. Nick credits dieser Seite und einer anderen Seite für seine komplette Lösung zusammen mit performance-Metriken. Ich, dass unten anstelle von nur ein link.
InformationsquelleAutor der Antwort Stix
Action<T>
stellt einen Delegaten, die einen parameter vom TypT
und gibt nichts zurück. Die lambda-Ausdrücke, die SieMakeSetter
stellen die Delegierten, die nehmen keine parameter und Rückgabe entwederSomeClass.SomeProperty
odersomeObject.SomeProperty
.Fehlermeldungen, die Sie bekommen, sind aufgrund der Tatsache, dass der compiler nicht darauf schließen, die Typen von lambda-Ausdrücken, die Sie vorbei sind in der
MakeSetter
Methode, weil das, was Sie übergeben haben, und was die Methode erwartet, sind nicht synchron.InformationsquelleAutor der Antwort Jason Punyon
Ihre
MakeSetter
erwartet einAction<T>
und übergeben Sie es einemFunc<T>
(() => someObject.SomeProperty
). Versuchen Sie Folgendes:BEARBEITEN nicht Aussehen wie Sie können convert-Anweisung Lambda-Ausdrücke in Ausdrücke. Dies ist etwas von einer Runde über Art und Weise, es zu tun, ohne Ausdrücke - direkt an die Delegierten:
InformationsquelleAutor der Antwort Igor Zevaka