在 C# 中,匿名类型是一种没有任何名称的类型(类),只能包含公共只读属性。 它不能包含其他成员,例如字段、方法、事件等。
您可以使用带有对象初始值语法的 new 运算符创建匿名类型。 隐式类型变量 var 用于保存匿名类型的引用。
下面的示例演示如何创建一个匿名类型变量 student,其中包含三个名为 Id、FirstName 和 LastName 的属性。
var student = new { Id = 1, FirstName = "James", LastName = "Bond" };
匿名类型的属性是只读的,不能用空、匿名函数或指针类型初始化。 可以使用点 (.) 表示法访问属性,与对象属性相同。 但是,您不能更改属性的值,因为它们是只读的。
var student = new { Id = 1, FirstName = "James", LastName = "Bond" };
Console.WriteLine(student.Id); //输出: 1
Console.WriteLine(student.FirstName); //输出: James
Console.WriteLine(student.LastName); //输出: Bond
student.Id = 2;//CS0200 无法为属性或索引器“<anonymous type: int Id, string FirstName, string LastName>.Id”赋值 - 它是只读的
student.FirstName = "Steve";//CS0200 无法为属性或索引器“<anonymous type: int Id, string FirstName, string LastName>.Id”赋值 - 它是只读的
匿名类型的属性可以包含另一个匿名类型。
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" }
};
匿名类型将始终是它所在方法的本地类型。 只能用object的方式返回出去。或传递给其它方法,但不建议这样做。 如果需要将其传递给另一个方法,请使用 struct 或 class 而不是匿名类型。(反编译的时候可以看到编译器会为它指定一个名字)
大多数情况下,匿名类型是使用 LINQ 查询的 Select 子句创建的,以从集合中的每个对象返回属性的子集。
class Program
{
static void Main(string[] args)
{
IList<Student> studentList = new List<Student>() {
new Student() { StudentID = 1, StudentName = "malema", age = 18 },
new Student() { StudentID = 2, StudentName = ".net", age = 21 },
new Student() { StudentID = 3, StudentName = "ma", age = 18 },
new Student() { StudentID = 4, StudentName = "le" , age = 20 },
new Student() { StudentID = 5, StudentName = "www" , 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; }
}
//输出
// 1-malema
// 2-.net
// 3-ma
// 4-le
// 5-www
在上面的示例中,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());
}