Esiste un modo semplice per analizzare una stringa (espressione lambda) in un delegato di azione?

.net c# expression-trees linq parsing

Domanda

Ho un metodo che altera un oggetto "Account" basato sul delegato dell'azione passato in esso:

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

Funziona come previsto ...

AlterAccount("Account1234", a => a.Enabled = false);

... ma ora quello che mi piacerebbe provare e fare è avere un metodo come questo:

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();
}

Può quindi essere usato come:

AlterAccount("Account1234", "a => a.Enabled = false");

per disabilitare l'account "Account1234".

Ho dato un'occhiata alla libreria di query dinamica di linq , che sembra fare più o meno quello che voglio, ma per i delegati di tipo Func, e la mia conoscenza degli alberi di espressione, ecc. Non è abbastanza buona per capire come ottenere ciò che volere.

C'è un modo semplice per fare ciò che voglio, o ho bisogno di imparare le espressioni correttamente e scrivere un carico di codice?

(Il motivo per cui voglio farlo è quello di consentire un modo semplice di aggiornare in massa gli oggetti account da uno script PowerShell in cui l'utente può specificare un'espressione lambda per eseguire le modifiche.)

Risposta popolare

Puoi provare questo: espressioni Lambda dinamiche che utilizzano un AppDomain isolato

Compila un'espressione lambda usando il compilatore CodeDOM. Per disporre l'assembly in memoria che viene creato, il compilatore viene eseguito su un AppDomain isolato. Per il passaggio dell'espressione attraverso il limite del dominio, deve essere serializzato. Ahimè, l' Expression<> non è Serializable . Quindi, deve essere usato un trucco. Tutti i dettagli sono spiegati nel post.

A proposito, sono l'autore di quel componente. Mi piacerebbe molto sentire il tuo feedback da esso.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché