2009-09-02 32 views
4

(注意该代码是一个例子)什么的someMethod(()=> x.Something)在C#平均

我有以下语法:

SomeMethod(() => x.Something) 

什么做的第一括号在表达中意味着什么?

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

+0

重复:http://stackoverflow.com/questions/630330/what-does-mean-in-c/630344#630344 – 2009-09-02 21:36:07

+0

好吧,道歉,这是一个重复。我很好奇它与'SomethMethod(x => x.Something)有什么不同' – 2009-09-02 21:40:18

回答

7

表达式中的第一个括号是什么意思?

这是不带任何参数的方法的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); 
} 
2

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

的一般形式是:

(input parameters) => expression 

如果你有

() => expression 

那么你已经创建了一个函数,它没有参数,并返回表达式的结果。

C#使用type inference来找出这些值的类型,它通过lexical closure捕获局部变量(如您的“x”变量)。

6

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

编辑:它不同于x => x.Something因为后者需要一个参数和Something被称为该参数。前版本x必须存在于函数之外的某处,并且在外部x之外调用Something。使用后一版本时,不需要外部x,即使存在,仍然会在函数的参数上调用某些东西,而没有其他东西。

1

该()表示该方法不采用任何参数。 例如,如果您分配使用lambda表达式一个正常的事件处理程序,它应该是这样的:

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

我假设X在某处你的方法内声明,如果是的话,你可以比较这个lambda表达式不具有PARAMATERS并返回x.someproperty

delegate{ 
return x.someproperty; 
} 

类型的委托是相同:

() => x.someproperty 
+0

前者不会编译。 – Dykam 2009-09-02 21:41:02

+0

@Dykam,谁说它不会?它会。尝试编译这个例子:http://cleigomes.net/powersource/Output.aspx?fl=3w1e3djw.she – Cleiton 2009-09-02 21:49:24

+0

因此,它假定返回类型? – 2009-09-02 22:05:18

0

得到你需要的someMethod拥有的System.Linq.Expressions.Expression<System.Func<object>>类型的参数属性的名称。然后可以通过表达式来确定属性名称。