SomeMethod(()=> x.Something)在C#中的含义是什么

时间:2009-09-02 21:30:52

标签: c# lambda

(注意代码是一个例子)

我有以下语法:

SomeMethod(() => x.Something) 

表达式中第一个括号的含义是什么?

我也很好奇你如何从传入的参数中获取属性名称。这是否可行?

7 个答案:

答案 0 :(得分:8)

  

表达式中第一个括号的含义是什么?

这是一个不带参数的方法的lambda语法。如果它需要1个参数,那就是:

SomeMethod(x => x.Something);

如果它采用了n + 1个参数,那么它将是:

SomeMethod((x, y, ...) => x.Something);
  

我也很好奇你如何从传入的参数中获取属性名称。这可能吗?

如果您的SomeMethod需要Expression<Func<T>>,那么是:

void SomeMethod<T>(Expression<Func<T>> e) {
    MemberExpression op = (MemberExpression)e.Body;
    Console.WriteLine(op.Member.Name);
}

答案 1 :(得分:7)

()是一个空参数列表。您正在定义一个不带参数的匿名函数,并返回x.Something

编辑:它与x => x.Something的不同之处在于后者需要一个参数并且在该参数上调用Something。前一个版本x必须存在于函数之外的某个地方,并且在x之外调用Something。对于后一版本,不必有外部x,即使存在,仍然会在函数的参数上调用Something而没有其他内容。

答案 2 :(得分:2)

这是一个lambda expression。也就是说,它是一种创建匿名函数或委托的方法。

一般形式是:

(input parameters) => expression

如果你有

() => expression

然后你创建了一个不带参数的函数,并返回表达式的结果。

C#使用type inference来确定值的类型,并通过lexical closure捕获局部变量(如“x”变量)。

答案 3 :(得分:2)

我假设x在方法内的某个地方声明,如果是,你可以将这个lambda表达式与没有参数的委托进行比较并返回x.someproperty的类型

delegate{
 return x.someproperty;
}

与以下内容相同:

() => x.someproperty

答案 4 :(得分:1)

()表示此方法不接受任何参数。 例如,如果使用lambda表达式分配普通事件处理程序,它将如下所示:

someButton.Click += (s, e) => DoSomething();

答案 5 :(得分:1)

另请参阅以下两篇博文,其中详细讨论了您的第二个问题,并提供了其他方法:

How to Find Out Variable or Parameter Name in C#?

How to Get Parameter Name and Argument Value From C# Lambda via IL?(或“如何不使用.NET Linq表达式从C#Lambda获取参数名称和参数值?”)

答案 6 :(得分:0)

要获取属性的名称,您需要SomeMethod具有类型为System.Linq.Expressions.Expression<System.Func<object>>的参数。然后,您可以浏览表达式以确定属性名称。