有一种简单的方法可以将(lambda表达式)字符串解析为Action委托吗?

Whi*_*isk 14 .net c# linq parsing expression-trees

我有一个方法,根据传递给它的动作委托改变"帐户"对象:

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

这按预期工作......

AlterAccount("Account1234", a => a.Enabled = false);
Run Code Online (Sandbox Code Playgroud)

...但是现在我想尝试做的是这样的方法:

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();
}
Run Code Online (Sandbox Code Playgroud)

它可以像以下一样使用:

AlterAccount("Account1234", "a => a.Enabled = false");
Run Code Online (Sandbox Code Playgroud)

禁用帐户"Account1234".

我已经看过linq动态查询库了,它似乎或多或少地做了我想要的但是对于Func类型的委托,而我对表达式树等的了解并不是很好来弄清楚如何实现我的目标想.

有没有一种简单的方法可以做我想要的,或者我是否需要正确学习表达式并编写大量代码?

(我想这样做的原因是允许从powershell脚本中批量更新帐户对象的简单方法,其中用户可以指定lambda表达式来执行更改.)

Ros*_*ant 1

没有通用方法可以在不进行完整编译的情况下将字符串解析为 lambda 表达式,因为 lambda 表达式可以引用 lambda 表达式外部定义的内容。据我所知,没有任何库可以处理您想要的特定情况。C# 讨论组的一个线程对此进行了很长的讨论。

获得所需内容的最简单方法是在运行时编译方法。您可以编写一个接受字符串“a.Enabled = true; return a;”的函数 并将其粘贴在以帐户作为参数的函数中间。我会使用这个作为起点,但您也可以使用另一个线程上提到的函数。