2012-04-10 43 views
2

Expression<T>是做什麼用的?什麼是表達<T>呢?

我已經看到了類似的方法使用:

private Expression<Func<MyClass,bool>> GetFilter(...) 
{ 
} 

你就不能返回Func<MyClass,bool>

由於<和>的跡象,Google和SO搜索都失敗了。

+0

搜索「表達樹」與「匿名代表」。 – Oded 2012-04-10 19:16:41

+0

所以表達式被稱爲表達樹? – Khan 2012-04-10 19:21:39

+1

它用於構建表達式樹。 – Oded 2012-04-10 19:21:54

回答

4

如果TDelegate表示委託類型,然後Expression<TDelegate>表示lambda表達式可以轉換到TDelegate類型的委託作爲表達樹。這允許你編程檢查一個lambda表達式來提取有用的信息。

舉例來說,如果你有

var query = source.Where(x => x.Name == "Alan Turing"); 

然後x => x.Name == "Alan Turning"可以編程,如果它表示爲一個表達式樹檢查,但沒有這麼多,如果它認爲是一個代表。這對於LINQ提供者來說特別有用,它將遍歷表達式樹來將lambda表達式轉換爲不同的表示形式。例如,LINQ到SQL將上述表達式樹轉換成

SELECT * FROM COMPUTERSCIENTIST WHERE NAME = 'Alan Turing' 

它可以這樣做,因爲lambda表達式的表示爲樹,其節點可以被走過和檢查這一點。

3

表達式允許您檢查委託內部代碼的結構,而不僅僅存儲委託本身。

像往常一樣,MSDN是對此事很清楚:

MSDN - Expression(TDelegate)

+0

謝謝,MSDN參考中的這一行幫助:* lambda表達式的內存數據表示* – Khan 2012-04-10 19:27:47

0

是的,Func<>可以用來代替表達式的位置。表達式樹的實用性在於它使遠程LINQ提供程序(如LINQ to SQL)能夠向前看,並查看允許查詢運行所需的語句。換句話說,將代碼視爲數據。

 //run the debugger and float over multBy2. It will be able to tell you that it is an method, but it can't tell you what the implementation is. 
     Func<int, int> multBy2 = x => 2 * x; 
     //float over this and it will tell you what the implmentation is, the parameters, the method body and other data 
     System.Linq.Expressions.Expression<Func<int, int>> expression = x => 2 * x; 

在上面的代碼中,您可以通過調試器比較哪些數據可用。我邀請你這樣做。你會看到Func只有很少的信息可用。用Expressions再次嘗試一下,你會看到很多信息,包括方法體和參數在運行時可見。這是表達式樹的真正力量。