我知道匿名类型不能从方法中返回。我也明白有一些解决方法可以做到这一点。我的问题是,Linq 提供者使用什么方法?例如,(提示对 Linq 提供程序如何工作的模糊理解),Select()
扩展方法应用于 an IQueryable
,其表达式树由 Linq 提供程序解析,转换为 SQL,然后将查询结果解析,加载到类型中。 ... 回来。
Select()
那么,Entity Framework 或 NHibernate 使用什么技术来返回类型?
我知道匿名类型不能从方法中返回。我也明白有一些解决方法可以做到这一点。我的问题是,Linq 提供者使用什么方法?例如,(提示对 Linq 提供程序如何工作的模糊理解),Select()
扩展方法应用于 an IQueryable
,其表达式树由 Linq 提供程序解析,转换为 SQL,然后将查询结果解析,加载到类型中。 ... 回来。
Select()
那么,Entity Framework 或 NHibernate 使用什么技术来返回类型?
它使用泛型。通过类型推断,编译器知道匿名类型的确切类型。
请注意,编译器会自动为匿名类型生成一个类。在那之后,它就像任何其他类型一样只是一个类型。
public IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> items,
Func<TSource, TResult> converter)
{
foreach(var item in items)
yield return converter(item);
}
您可以从您的方法返回一个匿名类型。问题是,你不能做强类型,因为匿名类型的类型名称你不知道 - 但它是编译器,这就是泛型与匿名类型一起工作的原因。
您正在谈论的解决方法也是使用泛型。
我相信它使用泛型,因此尽管返回类型看起来是“匿名的”,但由于您使用它的数据类型而为人所知。
简单的事实是,程序(一旦编译)根据传入(或操作)的类型知道要返回的确切类型
您可以在此处阅读更多关于泛型的信息,它们在编码时非常有用——只要您知道何时适当地使用它们