Gibt es eine einfache Möglichkeit, einen (Lambda-Ausdruck) String in einen Action-Delegaten zu parsen?

.net c# expression-trees linq parsing

Frage

Ich habe eine Methode, die ein "Konto" -Objekt basierend auf dem darin übergebenen Aktionsdelegaten ändert:

public static void AlterAccount(string AccountID, Action<Account> AccountAction) {
  Account someAccount = accountRepository.GetAccount(AccountID);
  AccountAction.Invoke(someAccount);
  someAccount.Save();
}

Das funktioniert wie vorgesehen ...

public static void AlterAccount(string AccountID, Action<Account> AccountAction) {
  Account someAccount = accountRepository.GetAccount(AccountID);
  AccountAction.Invoke(someAccount);
  someAccount.Save();
}

... aber jetzt möchte ich versuchen, eine Methode wie diese zu haben:

public static void AlterAccount(string AccountID, Action<Account> AccountAction) {
  Account someAccount = accountRepository.GetAccount(AccountID);
  AccountAction.Invoke(someAccount);
  someAccount.Save();
}

Es kann dann wie folgt verwendet werden:

public static void AlterAccount(string AccountID, Action<Account> AccountAction) {
  Account someAccount = accountRepository.GetAccount(AccountID);
  AccountAction.Invoke(someAccount);
  someAccount.Save();
}

um das Konto "Account1234" zu deaktivieren.

Ich habe mir die linq Dynamic Query Library angeschaut , die mehr oder weniger das zu tun scheint, was ich möchte, aber für Func-Delegaten, und mein Wissen über Expression-Bäume usw. ist nicht gut genug, um herauszufinden, wie ich was erreichen kann wollen.

Gibt es einen einfachen Weg, um zu tun, was ich will, oder muss ich Ausdrücke richtig lernen und eine Menge Code schreiben?

(Der Grund, warum ich dies tun möchte, ist, eine einfache Möglichkeit zum Massenaktualisieren von Kontoobjekten aus einem Powershell-Skript zu ermöglichen, wo der Benutzer einen Lambda-Ausdruck angeben kann, um die Änderungen durchzuführen.)

Beliebte Antwort

Sie können dies versuchen: Dynamische Lambda-Ausdrücke mit einer isolierten AppDomain

Es kompiliert einen Lambda-Ausdruck mit dem CodeDOM-Compiler. Um die speicherinterne Assembly zu AppDomain , die erstellt wird, wird der Compiler auf einer isolierten AppDomain . Um den Ausdruck durch die Domänengrenze zu führen, muss er serialisiert werden. Leider ist Expression<> nicht Serializable . Also, ein Trick muss verwendet werden. Alle Details werden in der Post erklärt.

Ich bin übrigens der Autor dieser Komponente. Ich würde sehr gerne Ihre Rückmeldungen hören.




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum