【问题标题】:How does the Select() method return anonymous types?Select() 方法如何返回匿名类型?
【发布时间】:2012-12-06 14:47:31
【问题描述】:

我知道匿名类型不能从方法中返回。我也明白有一些解决方法可以做到这一点。我的问题是,Linq 提供者使用什么方法?比如(cue dim理解Linq provider是如何工作的),Select()扩展方法被应用到一个IQueryable,其表达式树被Linq provider解析,变成SQL,查询结果被解析,加载变成一个类型,然后....返回。

那么,例如使用什么技术让Select() 返回类型?实体框架还是 NHibernate?

【问题讨论】:

  • 不完全确定你在这里问什么,但是: 1 - 方法可以返回匿名类型。 2 - Select() 返回 IEnumerable

标签: c# linq nhibernate entity-framework-4 anonymous-types


【解决方案1】:

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

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

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

您所说的解决方法也是使用泛型。

【讨论】:

  • 啊,我明白了,我完全明白了。您传递给Select()x =&gt; new { Blah = x.Blah } 参数是生成新类型的转换器。编译器对类型了如指掌;只有您作为程序员才考虑匿名类型...感谢您的解释。
  • 所以我认为一个方法实际上可以返回一个匿名类型是对的,只要返回类型是通用的,并且它接受一个标识类型的参数(@987654325 的TResult 部分@ 在你的例子中?
  • @David:关于你的第一条评论:正是
  • @David:方法可以通过多种方式返回匿名类型:1) 使用泛型 - 这需要调用者提供匿名类型 - 如 Select 2) 使用 object 作为返回类型 3) 使用dynamic 作为返回类型
【解决方案2】:

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

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

你可以read some more on generics here,它们在编码时非常有用——只要你知道什么时候适当地使用它们

【讨论】:

  • 感谢您的回答。我使用泛型,但我还有很多东西要学。缪斯太棒了!
猜你喜欢
  • 2010-09-08
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 2012-04-30
  • 1970-01-01
  • 2010-11-22
相关资源
最近更新 更多