技术开发 频道

LINQ项目-支持 LINQ 项目的语言功能


  匿名类型不能跨程序集边界共享;但是,编译器可确保在每个程序集中,属性名/类型对的给定序列最多有一个匿名类型。

  由于匿名类型通常用于投影,以选择现有结构化值的一个或多个成员,因此我们只需从匿名类型初始化的另一个值中引用字段或属性。这将导致一个新的匿名类型,其属性的名称、类型和值均从所引用的属性或字段复制而来。

  例如,请考虑以下示例,该示例通过组合其他值的属性创建了一个新的结构化值:
var bob = new Person { Name = "Bob", Age = 51, CanCode = true }; var jane = new { Age = 29, FirstName = "Jane" }; var couple = new { Husband = new { bob.Name, bob.Age }, Wife = new { Name = jane.FirstName, jane.Age } }; int ha = couple.Husband.Age; // ha == 51 string wn = couple.Wife.Name; // wn == "Jane"
  对上述字段或属性的引用只是一种方便的语法,可用于编写以下更显式的窗体:
var couple = new { Husband = new { Name = bob.Name, Age = bob.Age }, Wife = new { Name = jane.FirstName, Age = jane.Age } };
  在这两个示例中,couple 变量从 bob 和 jane 获得了自己的 Name 和 Age 属性副本。


  匿名类型通常用于查询的 select 子句。例如,请考虑以下查询:
var expr = people.Select(p => new { p.Name, BadCoder = p.Age == 11 }); foreach (var item in expr) Console.WriteLine("{0} is a {1} coder", item.Name, item.BadCoder ? "bad" : "good");


  在本例中,我们能够通过 Person 类型创建新投影,以完全匹配处理代码所需的形式,同时仍然提供静态类型的优势。
0
相关文章