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