我知道匿名類型不能從方法返回。我也明白,有這樣做的解決方法。我的問題是,Linq提供者使用什麼方法?例如,(暗示Linq提供程序如何工作),Select()
擴展方法應用於IQueryable
,其表達式樹由Linq提供程序分析,轉換爲SQL,並且查詢結果被解析,加載到類型中然後......返回。Select()方法如何返回匿名類型?
那麼使用什麼技術獲得Select()
來返回該類型,實體框架還是NHibernate?
我知道匿名類型不能從方法返回。我也明白,有這樣做的解決方法。我的問題是,Linq提供者使用什麼方法?例如,(暗示Linq提供程序如何工作),Select()
擴展方法應用於IQueryable
,其表達式樹由Linq提供程序分析,轉換爲SQL,並且查詢結果被解析,加載到類型中然後......返回。Select()方法如何返回匿名類型?
那麼使用什麼技術獲得Select()
來返回該類型,實體框架還是NHibernate?
它使用仿製藥。通過類型推斷,編譯器知道匿名類型的確切類型。
請注意,編譯器自動爲匿名類型生成一個類。之後,它只是一種類似於任何其他類型的類型。
public IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> items,
Func<TSource, TResult> converter)
{
foreach(var item in items)
yield return converter(item);
}
您可以返回從你的方法匿名類型。問題是,你不能這樣做強類型,因爲匿名類型的類型名稱是你不知道的 - 但它是編譯器,這就是泛型使用匿名類型的原因。
您正在討論的解決方法是使用泛型。
我相信它使用泛型,所以雖然返回類型看起來是「匿名的」,但它是已知的,因爲您正在使用它的數據類型。
簡單的事實是,程序(編譯一次)知道確切類型的編碼時,根據傳遞進來(或者操作)類型
您可以read some more on generics here,他們可以非常非常有用的回報 - 只要您知道何時適當使用它們即可。
感謝您的回答。我使用泛型,但我還有很多東西需要學習。繆斯真棒! – David
不完全確定你在這裏問什麼,但:1 - 方法可以返回匿名類型。 2 - Select()返回IEnumerable –
series0ne