(注意該代碼是一個例子)什麼的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