(注意该代码是一个例子)什么的someMethod(()=> x.Something)在C#平均
我有以下语法:
SomeMethod(() => x.Something)
什么做的第一括号在表达中意味着什么?
我也很好奇如何从传入的参数中获取属性名称。这是否可行?
(注意该代码是一个例子)什么的someMethod(()=> x.Something)在C#平均
我有以下语法:
SomeMethod(() => x.Something)
什么做的第一括号在表达中意味着什么?
我也很好奇如何从传入的参数中获取属性名称。这是否可行?
表达式中的第一个括号是什么意思?
这是不带任何参数的方法的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);
}
这是一个lambda expression。也就是说,这是一种创建匿名函数或委托的方法。
的一般形式是:
(input parameters) => expression
如果你有
() => expression
那么你已经创建了一个函数,它没有参数,并返回表达式的结果。
C#使用type inference来找出这些值的类型,它通过lexical closure捕获局部变量(如您的“x”变量)。
()
是一个空的参数列表。您正在定义一个不带参数的匿名函数并返回x.Something
。
编辑:它不同于x => x.Something
因为后者需要一个参数和Something被称为该参数。前版本x
必须存在于函数之外的某处,并且在外部x
之外调用Something。使用后一版本时,不需要外部x,即使存在,仍然会在函数的参数上调用某些东西,而没有其他东西。
该()表示该方法不采用任何参数。 例如,如果您分配使用lambda表达式一个正常的事件处理程序,它应该是这样的:
someButton.Click += (s, e) => DoSomething();
我假设X在某处你的方法内声明,如果是的话,你可以比较这个lambda表达式不具有PARAMATERS并返回x.someproperty
delegate{
return x.someproperty;
}
类型的委托是相同:
() => x.someproperty
得到你需要的someMethod拥有的System.Linq.Expressions.Expression<System.Func<object>>
类型的参数属性的名称。然后可以通过表达式来确定属性名称。
参见下面的两个博客文章是讨论究竟你的第二个问题,并提供替代方法:
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?“)
重复:http://stackoverflow.com/questions/630330/what-does-mean-in-c/630344#630344 – 2009-09-02 21:36:07
好吧,道歉,这是一个重复。我很好奇它与'SomethMethod(x => x.Something)有什么不同' – 2009-09-02 21:40:18