2009-09-02 61 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>>類型的參數屬性的名稱。然後可以通過表達式來確定屬性名稱。