C# - 匿名类型
在 C# 中,匿名类型是一种没有名称的类型(类),它只能包含公共的只读属性。它不能包含其他成员,例如字段、方法、事件等。
您可以使用 `new` 运算符和对象初始化器语法来创建匿名类型。隐式类型变量 `var` 用于保存匿名类型的引用。
以下示例演示了创建一个匿名类型变量 `student`,该变量包含三个名为 `Id`、`FirstName` 和 `LastName` 的属性。
var student = new { Id = 1, FirstName = "James", LastName = "Bond" };
匿名类型的属性是只读的,不能用 null、匿名函数或指针类型初始化。属性可以使用点号 (.) 访问,与对象属性相同。但是,由于属性是只读的,您无法更改属性的值。
var student = new { Id = 1, FirstName = "James", LastName = "Bond" };
Console.WriteLine(student.Id); //output: 1
Console.WriteLine(student.FirstName); //output: James
Console.WriteLine(student.LastName); //output: Bond
student.Id = 2;//Error: cannot chage value
student.FirstName = "Steve";//Error: cannot chage value
匿名类型的属性可以包含另一个匿名类型。
var student = new {
Id = 1,
FirstName = "James",
LastName = "Bond",
Address = new { Id = 1, City = "London", Country = "UK" }
};
您还可以创建匿名类型的数组。
var students = new[] {
new { Id = 1, FirstName = "James", LastName = "Bond" },
new { Id = 2, FirstName = "Steve", LastName = "Jobs" },
new { Id = 3, FirstName = "Bill", LastName = "Gates" }
};
匿名类型将始终是其定义方法的局部类型。它不能从方法返回。但是,匿名类型可以作为对象类型参数传递给方法,但不推荐这样做。如果需要将其传递给另一个方法,请使用结构或类而不是匿名类型。
大多数情况下,匿名类型是使用 LINQ 查询的 Select 子句创建的,用于从集合中的每个对象返回属性的子集。
class Program
{
static void Main(string[] args)
{
IList<Student> studentList = new List<Student>() {
new Student() { StudentID = 1, StudentName = "John", age = 18 },
new Student() { StudentID = 2, StudentName = "Steve", age = 21 },
new Student() { StudentID = 3, StudentName = "Bill", age = 18 },
new Student() { StudentID = 4, StudentName = "Ram" , age = 20 },
new Student() { StudentID = 5, StudentName = "Ron" , age = 21 }
};
var students = from s in studentList
select new { Id = s.StudentID, Name = s.StudentName };
foreach(var stud in students)
Console.WriteLine(stud.Id + "-" + stud.Name);
}
}
public class Student
{
public int StudentID { get; set; }
public string StudentName { get; set; }
public int age { get; set; }
}
2-Steve
3-Bill
4-Ram
5-Ron
在上面的示例中,LINQ 查询中的 select 子句只选择 `StudentID` 和 `StudentName` 属性,并将其分别重命名为 `Id` 和 `Name`。因此,它有助于节省内存和不必要的代码。查询结果集合只包含 `StudentID` 和 `StudentName` 属性,如下面的调试视图所示。
Visual Studio 支持匿名类型的 IntelliSense,如下所示。

在内部,所有匿名类型都直接派生自 `System.Object` 类。编译器会生成一个具有自动生成名称的类,并根据值表达式为每个属性应用适当的类型。尽管您的代码无法访问它。使用 `GetType()` 方法查看名称。
static void Main(string[] args)
{
var student = new { Id = 1, FirstName = "James", LastName = "Bond" };
Console.WriteLine(student.GetType().ToString());
}