我有一个方法可以根据传递给它的 Action 委托(delegate)来改变“帐户”对象:
public static void AlterAccount(string AccountID, Action<Account> AccountAction) {
Account someAccount = accountRepository.GetAccount(AccountID);
AccountAction.Invoke(someAccount);
someAccount.Save();
}
这按预期工作...
AlterAccount("Account1234", a => a.Enabled = false);
...但现在我想尝试做的是有一个像这样的方法:
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();
}
它可以像这样使用:
AlterAccount("Account1234", "a => a.Enabled = false");
禁用帐户“Account1234”。
我看过 linq dynamic query library ,这似乎或多或少地做了我想要的,但对于 Func 类型的委托(delegate),我对表达式树等的了解还不足以弄清楚如何实现我想要的。
有没有一种简单的方法可以做我想做的事,还是我需要正确学习表达式并编写大量代码?
(我想这样做的原因是允许一种从 powershell 脚本批量更新帐户对象的简单方法,用户可以在其中指定 lambda 表达式来执行更改。)
最佳答案
Dynamic LINQ 库是一个不错的选择,因为它会生成可以以轻量级方式编译为代码的表达式。
您提供的示例实际上产生了一个 bool 值——因此您应该能够请求一个 Func 并且它可能会对其进行排序。
编辑:这当然是错误的,因为表达式中根本没有赋值。
因此,另一种可能的方法是使用两个 lambda。一种是找到你想要的属性,一种是提供一个值:
(a => a.AccountId), (a => true)
然后使用反射将第一个 lambda 中引用的属性设置为第二个 lambda 的结果。 Hackish,但与调用 C# 编译器相比,它仍然可能是轻量级的。
这样您就不必自己做太多代码生成 - 您获得的表达式将包含您需要的大部分内容。
关于c# - 有没有一种简单的方法可以将(lambda 表达式)字符串解析为 Action 委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/714799/