我知道无法从方法返回匿名类型。我也明白,有办法解决这个问题。我的问题是,Linq提供商使用什么方法?例如,(提示对Linq提供程序的工作方式有点了解),Select()
扩展方法应用于IQueryable
,其表达式树由Linq提供程序解析,转换为SQL,查询结果解析,加载到一个类型然后....返回。
因此,使用Select()
返回该类型的技术是什么?实体框架还是NHibernate?
答案 0 :(得分:3)
它使用泛型。通过类型推断,编译器知道匿名类型的确切类型 请注意,编译器会自动为匿名类型生成一个类。在那之后,它只是一种类似任何其他类型的类型。
public IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> items,
Func<TSource, TResult> converter)
{
foreach(var item in items)
yield return converter(item);
}
您可以从方法中返回匿名类型。问题是,你不能这样做强类型,因为你不知道匿名类型的类型名称 - 但它是编译器,这就是泛型使用匿名类型的原因。
您正在谈论的解决方法也在使用泛型。
答案 1 :(得分:2)
我相信它使用泛型,所以尽管返回类型似乎是“匿名的”,但由于您正在使用它的数据类型,因此它是已知的。
简单的事实是,程序(一旦编译)根据传入(或操作)的类型知道要返回的确切类型
你可以read some more on generics here,它们在编码时非常有用 - 只要你知道何时适当使用它们