Expression<T>
是做什麼用的?什麼是表達<T>呢?
我已經看到了類似的方法使用:
private Expression<Func<MyClass,bool>> GetFilter(...)
{
}
你就不能返回Func<MyClass,bool>
?
由於<和>的跡象,Google和SO搜索都失敗了。
Expression<T>
是做什麼用的?什麼是表達<T>呢?
我已經看到了類似的方法使用:
private Expression<Func<MyClass,bool>> GetFilter(...)
{
}
你就不能返回Func<MyClass,bool>
?
由於<和>的跡象,Google和SO搜索都失敗了。
如果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表達式的表示爲樹,其節點可以被走過和檢查這一點。
謝謝,MSDN參考中的這一行幫助:* lambda表達式的內存數據表示* – Khan 2012-04-10 19:27:47
是的,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再次嘗試一下,你會看到很多信息,包括方法體和參數在運行時可見。這是表達式樹的真正力量。
搜索「表達樹」與「匿名代表」。 – Oded 2012-04-10 19:16:41
所以表達式被稱爲表達樹? –
Khan
2012-04-10 19:21:39
它用於構建表達式樹。 – Oded 2012-04-10 19:21:54