首页 > 代码库 > 匿名类型(C# 编程指南)

匿名类型(C# 编程指南)

匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。 类型名由编译器生成,并且不能在源代码级使用。 每个属性的类型由编译器推断。可通过使用 new 关键字和对象初始值创建匿名类型。 

以下示例显示了用两个名为AmountMessage的属性进行初始化的匿名类型。

1 var v = new { Amount = 108, Message = "Hello" }; 2  3 // Rest the mouse pointer over v.Amount and v.Message in the following//把鼠标放在 v.Amount and v.Message上面4 // statement to verify that their inferred types are int and string.//后续语句可以推断他们的类型 5 Console.WriteLine(v.Amount + v.Message); //是输出:108hello
  1. 匿名类型通常用在查询表达式的 select 子句中,以便返回源序列中每个对象的属性子集。 有关查询的更多信息,请参见 LINQ 查询表达式(C# 编程指南)
  2. 匿名类型包含一个或多个公共只读属性。 包含其他种类的类成员(如方法或事件)为无效。 用来初始化属性的表达式不能为 null、匿名函数或指针类型。

最常见的方案是用其他类型的属性初始化匿名类型。 在下面的示例中,假定名为Product的类存在。 Product包括ColorPrice属性,以及您不感兴趣的其他属性。 变量productsProduct对象的集合。 匿名类型声明以 new 关键字开始。 声明初始化了一个只使用Product的两个属性的新类型。 这将导致在查询中返回较少数量的数据。

如果您没有在匿名类型中指定成员名称,编译器会为匿名类型成员指定与用于初始化这些成员的属性相同的名称。 必须为使用表达式初始化的属性提供名称,如下面的示例所示。 在下面示例中,匿名类型的属性名称都为ColorPrice

1 var productQuery =  2     from prod in products //变量productsProduct对象的集合。3     select new { prod.Color, prod.Price }; 4  5 foreach (var v in productQuery) 6 { 7     Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price); 8 } 

 

通常,当您使用匿名类型来初始化变量时,可以通过使用 var 将变量作为隐式键入的本地变来变量进行声明。 类型名称无法在变量声明中给出,因为只有编译器能访问匿名类型的基础名称。 有关var的更多信息,请参见 隐式类型的局部变量(C# 编程指南)。

可通过将隐式键入的本地变量与隐式键入的数组相结合创建匿名键入的元素的数组,如下面的示例所示。

1 var anonArray = new[] { new { name = "apple", diam = 4 }, new { name = "grape", diam = 1 }};