J'ai une méthode qui modifie un objet « compte » sur la base du délégué de l'action passée en elle:Existe-t-il un moyen facile d'analyser une chaîne (expression lambda) dans un délégué d'action?
public static void AlterAccount(string AccountID, Action<Account> AccountAction) {
Account someAccount = accountRepository.GetAccount(AccountID);
AccountAction.Invoke(someAccount);
someAccount.Save();
}
Cela fonctionne comme prévu ...
AlterAccount("Account1234", a => a.Enabled = false);
... mais maintenant ce que je « aimerais essayer de faire est d'avoir une méthode comme ceci:
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();
}
Il peut alors être utilisé comme:
AlterAccount("Account1234", "a => a.Enabled = false");
pour désactiver le compte "Compte1234".
J'ai jeté un oeil à la linq dynamic query library, qui semble faire plus ou moins ce que je veux, mais pour les délégués de type Func, et ma connaissance des arbres d'expression, etc n'est pas assez bon pour savoir comment réaliser quoi Je veux.
Existe-t-il un moyen facile de faire ce que je veux, ou ai-je besoin d'apprendre des expressions correctement et écrire une charge de code?
(La raison pour laquelle je veux faire est de permettre un moyen facile d'objets de compte de mise à jour en vrac à partir d'un script Powershell où l'utilisateur peut spécifier une expression lambda pour effectuer les modifications.)
la dure serait d'utiliser System.Reflection.Emit.DynamicMethod et générer du code IL. Cependant, dans ce cas, il peut être plus facile d'accepter une syntaxe qui spécifie un nom de propriété et une valeur, et d'avoir un setter de propriétés de base de réflexion. – eulerfx
Oui, j'ai pensé à cela, mais je pense que cela exclurait des choses potentiellement puissantes, comme être capable d'appeler AlterAccount ("Account1234", "a => a.Enabled =! A.Enabled"); (Je ne sais pas pourquoi vous voudriez faire cela spécifiquement, mais il y a d'autres exemples plus raisonnables) – Whisk
J'ai eu un bon rire en lisant ceci: 'MagicLibrary.ConvertMagically' –