2012-12-06 94 views
0

我知道匿名類型不能從方法返回。我也明白,有這樣做的解決方法。我的問題是,Linq提供者使用什麼方法?例如,(暗示Linq提供程序如何工作),Select()擴展方法應用於IQueryable,其表達式樹由Linq提供程序分析,轉換爲SQL,並且查詢結果被解析,加載到類型中然後......返回。Select()方法如何返回匿名類型?

那麼使用什麼技術獲得Select()來返回該類型,實體框架還是NHibernate?

+1

不完全確定你在這裏問什麼,但:1 - 方法可以返回匿名類型。 2 - Select()返回IEnumerable series0ne

回答

3

它使用仿製藥。通過類型推斷,編譯器知道匿名類型的確切類型。
請注意,編譯器自動爲匿名類型生成一個類。之後,它只是一種類似於任何其他類型的類型。

public IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> items, 
                Func<TSource, TResult> converter) 
{ 
    foreach(var item in items) 
     yield return converter(item); 
} 

您可以返回從你的方法匿名類型。問題是,你不能這樣做強類型,因爲匿名類型的類型名稱是你不知道的 - 但它是編譯器,這就是泛型使用匿名類型的原因。

您正在討論的解決方法是使用泛型。

+0

啊,我明白了,我完全明白了。傳遞給'Select()'的'x => new {Blah = x.Blah}'參數是生成新類型的轉換器。編譯器知道關於類型的所有信息;它只是你作爲程序員,認爲類型匿名...感謝解釋。 – David

+0

所以我認爲一個方法實際上可以返回一個匿名類型,只要返回類型是通用的,並且它接受一個標識類型的參數('Func '的TResult'部分您的示例? – David

+0

@David:關於您的第一條評論:確切 –

2

我相信它使用泛型,所以雖然返回類型看起來是「匿名的」,但它是已知的,因爲您正在使用它的數據類型。

簡單的事實是,程序(編譯一次)知道確切類型的編碼時,根據傳遞進來(或者操作)類型

您可以read some more on generics here,他們可以非常非常有用的回報 - 只要您知道何時適當使用它們即可。

+1

感謝您的回答。我使用泛型,但我還有很多東西需要學習。繆斯真棒! – David