C#高级编程(第10版) C# 6 & .NET Core 1.0 (.NET开发经典名著)
上QQ阅读APP看书,第一时间看更新

3.4 匿名类型

第2章讨论了var关键字,它用于表示隐式类型化的变量。var与new关键字一起使用时,可以创建匿名类型。匿名类型只是一个继承自Object且没有名称的类。该类的定义从初始化器中推断,类似于隐式类型化的变量。

如果需要一个对象包含某个人的姓氏、中间名和名字,则声明如下:

        var captain = new
        {
          FirstName = "James",
          MiddleName = "T",
          LastName = "Kirk"
        };

这会生成一个包含FirstName、MiddleName和LastName属性的对象。如果创建另一个对象,如下所示:

        var doctor = new
        {
          FirstName = "Leonard",
          MiddleName = string.Empty,
          LastName = "McCoy"
        };

那么captain和doctor的类型就相同。例如,可以设置captain = doctor。只有所有属性都匹配,才能设置captain = doctor。

如果所设置的值来自于另一个对象,就可以简化初始化器。如果已经有一个包含FirstName、MiddleName和LastName属性的类,且有该类的一个实例(person), captain对象就可以初始化为:

        var captain = new
        {
          person.FirstName,
          person.MiddleName,
          person.LastName
        };

person对象的属性名应投射到新对象名captain,所以captain对象应有FirstName、MiddleName和LastName属性。

这些新对象的类型名未知。编译器为类型“伪造”了一个名称,但只有编译器才能使用它。我们不能也不应使用新对象上的任何类型反射,因为这不会得到一致的结果。