C# - 匿名类型 Anonymous Type

在 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());
}
下一篇:C# 动态类型
最近更新的
...