属性模式可匹配匿名类型属性值,因编译器会生成含公共只读属性的类。如 var person = new { Name = "Alice", Age = 30 }; 可用 if (person is { Name: "Alice", Age: 30 }) 检查属性,或在 switch 表达式中按结构分支,支持全属性或部分属性匹配,无需知晓具体类型名。

在 C# 中,属性模式(property pattern)可以用于匹配对象的属性值,即使该对象是匿名类型。这是因为匿名类型在编译时会生成一个具有公共只读属性的类,这些属性可以直接通过属性模式进行匹配。
匿名类型的特性
当你创建一个匿名类型时,例如:
var person = new { Name = "Alice", Age = 30 };C# 编译器会在后台生成一个不可变的密封类,包含公共的 Name 和 Age 属性。这使得你可以使用属性模式来解构和匹配这些属性。
使用属性模式匹配匿名类型
你可以在 switch 表达式或 is 表达式中使用属性模式来检查匿名对象的结构和值:
if (person is { Name: "Alice", Age: 30 }){
Console.WriteLine("匹配成功");
}
这段代码检查 person 是否具有 Name 等于 "Alice" 且 Age 等于 30 的属性。只要属性名称和值匹配,表达式就返回 true。
也可以只匹配部分属性:
Scala也是一种函数式语言,其函数也能当成值来使用。Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化 。Scala的Case Class及其内置的模式匹配相当于函数式编程语言中常用的代数类型(Algebraic Type)。 Scala课堂是Twitter启动的一系列讲座,用来帮助有经验的工程师成为高效的Scala 程序员。Scala是一种相对较新的语言,但借鉴了许多熟悉的概念。因此,课程中的讲座假设听众知道这些概念,并展示了如何在Scala中使用它们。我们发现
{
Console.WriteLine("名字是 Alice");
}
这里不关心 Age 的值,只要 Name 是 "Alice" 就匹配成功。
在 switch 表达式中使用
属性模式也适用于 switch 表达式:
string result = person switch{
{ Name: "Alice", Age: 30 } => "Alice, 30岁",
{ Name: "Bob" } => "Bob",
_ => "未知"
};
这种写法清晰地表达了基于对象结构的多条件分支逻辑。
基本上就这些。只要匿名类型的属性名和目标一致,属性模式就能正常工作,无需知道具体类型名称。









