¿Hay una manera fácil de analizar una cadena (expresión lambda) en un delegado de acción?

.net c# expression-trees linq parsing

Pregunta

Tengo un método que altera un objeto "Cuenta" basado en la acción que el delegado pasó a él:

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

Esto funciona según lo previsto ...

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

... pero ahora lo que me gustaría intentar es tener un método como este:

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

Entonces se puede utilizar como:

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

para deshabilitar la cuenta "Account1234".

He echado un vistazo a la biblioteca de consultas dinámicas de linq , que parece hacer más o menos lo que quiero, pero para los delegados de tipo Func, y mi conocimiento de los árboles de Expresión, etc. no es lo suficientemente bueno como para averiguar cómo lograr lo que yo necesito. querer.

¿Hay una manera fácil de hacer lo que quiero o necesito aprender las expresiones correctamente y escribir una carga de código?

(La razón por la que quiero hacer esto es permitir una forma fácil de actualizar de forma masiva los objetos de cuenta desde un script de powershell donde el usuario puede especificar una expresión lambda para realizar los cambios).

Respuesta popular

Puede intentar esto: Expresiones Lambda dinámicas usando un dominio de aplicación aislado

Compila una expresión lambda usando el compilador CodeDOM. Para disponer el ensamblaje en memoria que se crea, el compilador se ejecuta en un AppDomain aislado. Para pasar la expresión a través del límite del dominio, debe ser serializada. Por desgracia, la Expression<> no es Serializable . Por lo tanto, un truco tiene que ser utilizado. Todos los detalles se explican en el post.

Soy el autor de ese componente, por cierto. Me gustaría mucho escuchar sus comentarios al respecto.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow