C#匿名类型

在 C# 中,匿名类型是一种不需要定义具体类型的对象。它通常用于在运行时创建临时对象,而无需编写类或结构体等定义类型的代码。


创建一个匿名类型

创建一个匿名类型,你可以使用以下语法:

var anonymousObject = new { Property1 = "Value1", Property2 = 2 };

这个语句将创建一个匿名类型,其中包含两个属性:Property1 和 Property2。你可以使用点号操作符来访问这些属性的值,如下所示:

Console.WriteLine(anonymousObject.Property1);
Console.WriteLine(anonymousObject.Property2);

注意,匿名类型的属性是只读的,这意味着你无法更改它们的值。


Linq中使用匿名类型

匿名类型通常用于 LINQ 查询,因为它们允许在查询过程中创建临时对象。例如,以下代码使用匿名类型来创建一个包含选手姓名和年龄的新列表:

var players = new List<Player>
{
    new Player { Name = "Tom", Age = 25 },
    new Player { Name = "Jerry", Age = 23 },
    new Player { Name = "Mickey", Age = 28 }
};
var playerDetails = from p in players
                    select new { p.Name, p.Age };

在这个示例中,我们从 players 列表中选择选手的姓名和年龄,并将它们存储在一个匿名类型的列表中。通过这种方式,我们可以轻松地创建一个临时对象,而无需定义一个新的类或结构体。


 跨程序集使用

在 C# 中,匿名类型的作用域仅限于声明它们的方法或代码块。这意味着如果你在一个程序集中创建一个匿名类型,你无法在另一个程序集中直接使用该类型。

但是,你可以通过将匿名类型转换为 object 类型或 dynamic 类型来绕过这个限制。例如,你可以将匿名类型作为方法的返回值,然后在另一个程序集中使用该方法的返回值:

public object GetAnonymousObject()
{
    var anonymousObject = new { Property1 = "Value1", Property2 = 2 };
    return anonymousObject;
}

在另一个程序集中,你可以使用反射来访问匿名类型的属性:

var obj = GetAnonymousObject();
var type = obj.GetType();
var property1 = type.GetProperty("Property1").GetValue(obj);
var property2 = type.GetProperty("Property2").GetValue(obj);

需要注意的是,这种方法需要使用反射来访问匿名类型的属性,这可能会影响性能。因此,如果你需要跨程序集使用类型,建议使用具有明确类型名称的类或结构体等类型。


果糖网