(注意代码是一个例子)
我有以下语法:
SomeMethod(() => x.Something)
表达式中第一个括号的含义是什么?
我也很好奇你如何从传入的参数中获取属性名称。这是否可行?
答案 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>>
的参数。然后,您可以浏览表达式以确定属性名称。