0

我知道匿名类型不能从方法中返回。我也明白有一些解决方法可以做到这一点。我的问题是,Linq 提供者使用什么方法?例如,(提示对 Linq 提供程序如何工作的模糊理解),Select()扩展方法应用于 an IQueryable,其表达式树由 Linq 提供程序解析,转换为 SQL,然后将查询结果解析,加载到类型中。 ... 回来。

Select()那么,Entity Framework 或 NHibernate 使用什么技术来返回类型?

4

2 回答 2

3

它使用泛型。通过类型推断,编译器知道匿名类型的确切类型。
请注意,编译器会自动为匿名类型生成一个类。在那之后,它就像任何其他类型一样只是一个类型。

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

您可以从您的方法返回一个匿名类型。问题是,你不能做强类型,因为匿名类型的类型名称你不知道 - 但它是编译器,这就是泛型与匿名类型一起工作的原因。

您正在谈论的解决方法也是使用泛型。

于 2012-12-06T14:51:46.817 回答
2

我相信它使用泛型,因此尽管返回类型看起来是“匿名的”,但由于您使用它的数据类型而为人所知。

简单的事实是,程序(一旦编译)根据传入(或操作)的类型知道要返回的确切类型

您可以在此处阅读更多关于泛型的信息,它们在编码时非常有用——只要您知道何时适当地使用它们

于 2012-12-06T14:51:24.567 回答