Gibt es eine einfache Möglichkeit zum analysieren eines (lambda-Ausdruck) string in ein Action-Delegaten?
Habe ich eine Methode, welche ein "Konto" - Objekt basierend auf dem action-Delegaten übergeben:
public static void AlterAccount(string AccountID, Action<Account> AccountAction) {
Account someAccount = accountRepository.GetAccount(AccountID);
AccountAction.Invoke(someAccount);
someAccount.Save();
}
Dieser funktioniert wie vorgesehen...
AlterAccount("Account1234", a => a.Enabled = false);
...aber was nun, würde ich mag, um zu versuchen und tun, ist eine Methode, wie diese:
public static void AlterAccount(string AccountID, string AccountActionText) {
Account someAccount = accountRepository.GetAccount(AccountID);
Action<Account> AccountAction = MagicLibrary.ConvertMagically<Action<Account>>(AccountActionText);
AccountAction.Invoke(someAccount);
someAccount.Save();
}
Kann dann verwendet werden wie:
AlterAccount("Account1234", "a => a.Enabled = false");
deaktivieren Konto "Account1234".
Hatte, habe ich einen Blick auf die linq dynamic query library, die scheint, zu tun mehr oder weniger was ich will, aber für die Func-type-Delegierten, und mein wissen von Expression trees, etc ist nicht ganz gut genug, um herauszufinden, wie Sie das erreichen, was ich will.
Gibt es einen einfachen Weg das zu tun, was ich will, oder muss ich das lernen richtig Ausdrücken und schreiben Sie eine Last von code?
(Der Grund, warum ich dies tun wollen, ist es, eine einfache Möglichkeit, bulk-Aktualisierung der Konto-Objekte aus einem powershell-Skript, in dem der Benutzer angeben kann wird ein lambda-Ausdruck, führen Sie die änderungen.)
Ja, hab ich schon gedacht, aber ich glaube, das würde ausschließen, einige potentiell wichtige Dinge, wie zum Beispiel das call-AlterAccount("Account1234", "a=>ein.Enabled = !ein.Aktiviert"); (nicht sicher, warum Sie wollen würde, um zu tun, speziell, aber es gibt andere sinnvollere Beispiele)
Ich hatte ein gutes lachen, Lesen:
MagicLibrary.ConvertMagically
InformationsquelleAutor Whisk | 2009-04-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dynamische LINQ-Bibliothek ist eine gute Wahl, da es generieren werden Ausdrücke, die Sie erstellen können, um code in einem leichten Mode.
Das Beispiel, das Sie eigentlich vorgesehen, erzeugt ein boolean-so sollten Sie in der Lage zu Fragen, für eine Func und es vielleicht Sortieren Sie aus.
Edit: Das ist natürlich falsch, wie Ausdrücke haben keine Zuordnung in Ihnen überhaupt.
So, eine andere Möglichkeit ist es, zwei Lambda-Ausdrücke. Eine zu finden die Immobilie, die Sie wollen, zu geben Sie einen Wert ein:
(ein => ein.AccountId), (a => true)
Dann verwenden Sie reflektion, um die Eigenschaft auf die in der ersten lambda mit dem Ergebnis der zweiten. Hackish, aber es ist immer noch wahrscheinlich leicht gegenüber dem aufrufen der C# - compiler.
Diese Weise Sie don ' T haben viel zu tun codegen selbst - die Ausdrücke, die Sie erhalten werden, enthalten die meisten Sie alles, was Sie brauchen.
Bah, du hast Recht. Es funktioniert für funcs Func<bool> exp = () => test = false; aber nicht Ausdrücken, da Sie keine Möglichkeit haben Sie zu vertreten Zuordnung.
Yep - ich glaube, ich kann gehen Sie entlang der route zu versuchen, ändern Sie die Dynamische LINQ-Sachen zu arbeiten, mit der Aktion<T> sowie Func<T, TResult>...
Schneebesen - wir modifizierte dynamische LINQ-eine Menge. (Hinzugefügt zu lassen und zu tun, Bindungen, verschiedene andere Funktionen.) Es kompiliert Ausdrücke und Ausdrücke haben keine Zuordnung.
Also, im Grunde müssen Sie deutlich erweitern. Zum Beispiel, aufgeteilt auf =, und kompilieren Sie sind wie ein Ausdruck, dann wireup die eigentliche Zuordnung/set-Eigenschaft mit codegen.
InformationsquelleAutor MichaelGG
Können Sie versuchen, diese: Dynamische Lambda-Ausdrücke Mit Einer Isolierten AppDomain
Kompiliert ein lambda-Ausdruck mit CodeDOM compiler. Um die Entsorgung der in-memory-assembly erzeugt wird, der compiler läuft auf einem isolierten
AppDomain
. Für die Weitergabe der Ausdruck über die domänengrenze hinweg, er hat serialisiert werden. Ach,Expression<>
ist nichtSerializable
. Also, ein trick angewendet werden. Alle details sind in der post erklärt.Ich bin der Autor der Komponente, die durch die Art und Weise. Ich würde sehr gerne Ihre Meinung hören.
InformationsquelleAutor jpbochi
Es gibt kein allgemeingültiges Verfahren zum analysieren einer Zeichenfolge in einen lambda-Ausdruck ohne eine vollständige Zusammenstellung, da lambda-Ausdrücke verweisen können, die Dinge, die definiert sind außerhalb des lambda-Ausdrucks. Ich kenne keine Bibliothek, die behandelt den konkreten Fall, den Sie wollen. Es gibt eine lange Diskussion über diese auf einer thread an einem C# - Diskussionsgruppe.
Der einfachste Weg, um zu bekommen, was Sie wollen ist zu kompilieren, eine Methode zur Laufzeit. Sie können eine Funktion schreiben, die den string "ein.Enabled = true; return a;" und-sticks, die in der Mitte eine Funktion, die nimmt einem Konto als parameter. Ich würde dieses Bibliothek als Ausgangspunkt, aber Sie können die Funktion auch verwenden, erwähnt auf ein anderer thread.
rossfabricant; die dynamische linq-Bibliothek erwähnt er tut genau das. Natürlich, Sie haben, um die Eingabe von Informationen, wenn Sie gehen, um zu kompilieren, aber es kompiliert einwandfrei.
Es können Abfragen erstellen, aber ich habe nicht gesehen, dass es könnte alles bauen, das ändert Zustand.
Das ist interessant - besonders der thread über microsoft.öffentlichkeit.dotnet.Sprachen.csharp - es scheint, dass mit Expression trees ist der Weg nach vorne mit diesem tho, ich weiß nicht Recht sehen, wie die dynamische Zusammenstellung der route ermöglichen eine einfache lambda-Ausdruck eingegeben werden, nach vorne und erhalten die gewünschten Ergebnisse.
Ein lambda-Ausdruck wird nicht funktionieren, aber mit diesem Ansatz, wenn Sie wissen, die Typen und Anzahl der Argumente im Voraus können Sie den Faktor aus alle Kessel-Platte und der client-code kann nur übergeben Sie eine Zeichenfolge wie "ein.Enabled = !ein.Aktiviert".
InformationsquelleAutor RossFabricant
Einfach:
Grundsätzlich müssen Sie erstellen Sie die folgende Klasse mit CodeDom:
Unter der Annahme, dass
IHasAccountAction
ist:Wenn dies geschehen ist, können Sie den Ausdruck zusammengestellt von string mit Leichtigkeit. Wenn Sie brauchen, Ihren Ausdruck-Darstellung, verwenden Sie
Expression<Action<Account>>
stattAction<Account>
im generierten Typ.InformationsquelleAutor Alex Yakunin