如何将表达式理解为 C# 中的方法参数 [重复]

Posted

技术标签:

【中文标题】如何将表达式理解为 C# 中的方法参数 [重复]【英文标题】:How to understand expressions as method parameters in C# [duplicate] 【发布时间】:2020-02-01 21:59:14 【问题描述】:

我开始越来越多地看到像下面这样的方法,但这是一个我不完全理解的概念。

    public virtual Task<List<T>> GetAsync(Expression<Func<T, bool>> exp)
    
        using (var conn = _factory.OpenDbConnection())
        
            return conn.SelectAsync(exp);
        
    

有人可以帮我翻译一个表达式的方法参数吗?就像解释它与标准实例参数有何不同?

【问题讨论】:

你熟悉db.SomeTable.Where(r =&gt; r.Value == 42)吗? 【参考方案1】:

这些被称为Expression Trees (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/expression-trees/)。

基本上它是一个lamdba 可以翻译到另一个平台,从它的外观来看,你的情况是某种数据库。这个function 将(由库)翻译成SQL,然后在数据库中执行。

在您的程序代码中,您通常只需要lambdas (Func&lt;&gt;),但在某些情况下您需要Expression Tree。除了您的示例之外,有时您还需要一个动态构造的函数,可以使用这些函数来完成。

关于lambdas的一般信息可以在这里找到:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/lambda-expressions

【讨论】:

以上是关于如何将表达式理解为 C# 中的方法参数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

C#将方法作为参数传递给另一个方法[重复]

C# 中的正则表达式模式 [重复]

C#中的var理解

为通用 c# 集合中的每个值调用一个函数[重复]

ref关键字的用法

c#去除多余空格的最快方法