在expression.Compile()()中解释2对括号

时间:2018-01-03 13:07:47

标签: c# .net asp.net-web-api

你能解释一下这个奇怪的代码是做什么的吗?

expression.Compile()();

为什么这里有两对括号?我没有在谷歌找到任何东西。完整的方法是

public Validator NotEmpty(Expression<Func<IEnumerable<T>>> expression)
{
    var member = (MemberExpression)expression.Body;
    string propertyName = member.Member.Name;
    IEnumerable<T> value = expression.Compile()();

    if (value == null || !value.Any())
    {
        ValidationResult.AddError(propertyName, "Shouldn't be empty");
    }
    return this;
}

它的用法如下:

_validator.NotEmpty(() => request.PersonIds);  // request.PersonIds is List<int>

此方法检查集合是空还是空。一切正常,但我对该代码有点困惑。我以前从未见过在C#中使用过两对括号。这是什么意思?

2 个答案:

答案 0 :(得分:25)

好吧,您将int列表作为表达式树传递给方法。此表达式生成IEnumerable<T>的值(在本例中为IEnumerable<int>)。

要获取表达式的值,您需要将此表达式编译为委托Func<IEnumerable<T>>,然后调用委托。 实际上,我可以编写两行独立的代码而不是上面使用的较短语法:

Func<IEnumerable<T>> del = expression.Compile();
IEnumerable<T> value = del();

答案 1 :(得分:4)

两个方括号()实际上是一个调用方法或委托的运算符。请参阅here

表达式&#34;表达式.Compile()&#34;似乎提供了一个可以调用的委托。然后第二对括号调用此委托。

您也可以将其重写为:

var del = expression.Compile();
del();