【问题标题】:How to convert Func<T,bool> to Expression<Func<T,bool>>如何将 Func<T,bool> 转换为 Expression<Func<T,bool>>
【发布时间】:2013-02-16 05:35:29
【问题描述】:

我有一个这样的函数:

 Func<MyClass, bool> func = x=>Id == 5;

如何将其转换为:

 Expression<Func<MyClass, bool>>

【问题讨论】:

  • 表达式是 Lambda 函数的中间表示。 Func 是编译后的 lambda 函数本身。不要认为你可以在两者之间转换。为什么需要这样做?

标签: c# linq c#-4.0 lambda expression-trees


【解决方案1】:

你可以写:

Expression<Func<MyClass,bool>> expr = x=>Id == 5;

这会将expr 设置为Id == 5 的表达式树。

如果你这样做:

Func<MyClass, bool> func = x=>Id == 5;
Expression<Func<MyClass, bool>> expr = mc => func(mc);

然后这会将expr 设置为调用func 的表达式树,而不是func 主体的表达式树。

【讨论】:

    【解决方案2】:

    试试这个:

    Func<MyClass, bool> func = x=>Id == 5;
    Expression<Func<MyClass, bool>> expr = mc => func(mc);
    

    【讨论】:

    • 这实际上将expr 设置为对接受MyClass 并返回bool 的委托的调用。 expr 不会保存实际 lambda 的语法树。
    • 是的。所以呢?也许问题的作者应该就是这样。
    • 这不应该被接受的答案。该方法不会被转换为表达式。
    • 方法转换为Expression。
    【解决方案3】:

    您可以创建一个表达式来表示对您创建的委托的调用。但大多数时候,当您使用Expressions 时,您这样做是为了了解代码的作用(例如,将其转换为 SQL)。而且你不能用一个表达式来调用一个不透明的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 2021-06-17
      • 2023-03-31
      相关资源
      最近更新 更多