所以從表達的角度來看,這個值是一個常數。它不能被表達式改變。
你擁有的是一個潛在的開放式關閉 - 即值可以在表達式執行之間改變,但不會在執行期間改變。所以這是一個「不變的」。這是函數式編程和無法實現的編程世界之間的範例區別。
考慮
int a =2;
Expression<Func<int, int>> h = x=> x+ a;
Expression<Func<int, int>> j = x => x +2;
a = 1;
術語一個是其成員接入到該包紮並訪問堆棧上的變量的匿名類。第一個節點是一個MemberAccess節點,然後是該節點 - 該表達式是一個常量。
對於上面的代碼:
((SimpleBinaryExpression)(h.Body)).Right
{value(WindowsFormsApplication6.Form1+<>c__DisplayClass0).a}
CanReduce: false
DebugView: ".Constant<WindowsFormsApplication6.Form1+<>c__DisplayClass0>(WindowsFormsApplication6.Form1+<>c__DisplayClass0).a"
Expression: {value(WindowsFormsApplication6.Form1+<>c__DisplayClass0)}
Member: {Int32 a}
NodeType: MemberAccess
Type: {Name = "Int32" FullName = "System.Int32"}
而這下面的常數:
((MemberExpression)((SimpleBinaryExpression)(h.Body)).Right).Expression
{value(WindowsFormsApplication6.Form1+<>c__DisplayClass0)}
CanReduce: false
DebugView: ".Constant<WindowsFormsApplication6.Form1+<>c__DisplayClass0>(WindowsFormsApplication6.Form1+<>c__DisplayClass0)"
NodeType: Constant
Type: {Name = "<>c__DisplayClass0" FullName = "WindowsFormsApplication6.Form1+<>c__DisplayClass0"}
Value: {WindowsFormsApplication6.Form1.}
}
}
普通的老2出來的:
((SimpleBinaryExpression)(j.Body)).Right
{2}
CanReduce: false
DebugView: "2"
NodeType: Constant
Type: {Name = "Int32" FullName = "System.Int32"}
Value: 2
,所以我不知道這是否有助於你。您可以通過查看父節點或父節點訪問的對象的類型來進行判斷。
添加爲你澄清的結果 -
所以當你說
user => user.Email == email
你的意思是查找所有用戶的電子郵件等於傳入的參數 - 但是這種聯繫表達意味着完全不同。
你想說什麼
Expression<Func<User, string, bool>> (user, email) => user.Email == email
這樣的電子郵件,現在將是一個參數。如果你不喜歡,你可以做另一件事。
第二個例子會工作得很好 - 不需要額外的參數consts是const。
t => t.Status != TaskStatus.Done && t.Status != TaskStatus.Failed
編輯:添加另一種方式:
的,你必須做的就是你的代碼工作的事情,所以一個是聲明字符串電子郵件拉姆達外 - 這是一種笨拙。
你可以通過傳統的方式將它們放在特定的位置來識別參數 - 比如靜態類。然後,當通過Lambda時,你不必看一些可怕的cloture對象 - 但是你的製作很好的靜態類。
public static class Parameter
{
public static T Input<T>(string name)
{
return default(T);
}
}
然後你的代碼如下所示:
Expression<Func<User, bool>> exp = x => x.Email == Parameter.Input<String>("email");
然後,您可以遍歷樹 - 當你來到一個呼叫參數靜態類,你可以看看類型和名稱(在參數集合中)並關閉你去...
我的問題可能不夠清楚,但Email實際上是用戶對象的屬性。 –
@SteenT - 表達式樹是什麼樣的?它*可能是同樣的東西,默默地捕獲'this'(因爲'email'隱含地是'this.email')。所以我*可能*期望'會員(「電子郵件」,會員(「這個」,captureClass))(如果你明白我的意思) –
@SteenT - 啊,在我的回答中,我在談論右邊的'電子郵件'手邊。上面的註釋應該解釋左邊的'user.Email' ... –