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

标签 c# .net linq parsing expression-trees

我有一个方法可以根据传递给它的 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/

相关文章:

c# - 在给定的用户列表中分布

c# - SQL1159 DB2 .NET 数据提供程序初始化错误,原因代码 2

c# - 在 c# (LINQ-2-Entities) 中实现 "IN"的自定义扩展函数

.net - 适应屏幕和字体设置的 WPF 应用程序(或者,我如何将 DLU 与 WPF 中的单元相关联?)

c# - EF Core 选择一个由相关实体过滤的实体

c# - 在特定条目之后选择有序列表中的项目

c# - 导入 DLL 时,为什么必须将方法声明为静态和外部?

c# - 主键生成方法

c# - 有没有办法在 Razor (MVC3) View 中执行 `extern alias`?

c# - 接口(interface)从 vb.net 到 c# 的转换