.NET 6新特性试用 | 模式匹配之Extended Property Patterns


模式匹配是一种测试表达式以确定其是否具有某些特征的技术。

例如, 下面的Employee类和Manager类:

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Manager? Manager { get; set; }
}

public class Manager : Employee
{
    public string Position { get; set; }
}

我们可以使用模式匹配,检查Employee实例变量的实际类型并且匹配其属性,如下所示:

Employee obj = new Manager { Id=1, Name="zhangsan", Position="CEO" };
if(obj is Manager { Position: "CEO" } ceo)
{
    Console.WriteLine(ceo.Name);
};

Extended Property Patterns

如果要使用模式匹配检查变量嵌套的属性,则书写起来比价复杂,如下所示:

if(obj is Employee { Manager: { Name:"lisi", Manager:{ Position: "CEO" } } } employee)

而在.NET 6中,我们可以使用.引用属性的嵌套成员,这种方式称为Extended Property Patterns(扩展属性模式)

将上面的代码改写后如下:

if(obj is Employee { Manager.Name:"lisi", Manager.Manager.Position: "CEO" } employee)

另外,使用扩展属性模式不仅可以引用类定义的嵌套属性,同时还可以使用嵌套属性原生类型的属性,如下所示:

if(obj is Employee { Manager.Name.Length:4 } employee)

结论

需要注意的是,如果变量的Manager属性为null,或者任何嵌套属性为null 都不会得到NullReferenceException。因为在这里编写模式是为了检查对象是否匹配,而不是使用代码直接访问该属性。

这意味着,如果Manager属性为null,则模式{Manager.Name:"lisi"}不匹配,则上面if语句的条件计算结果为false,仅此而已。

利用Extended Property Patterns这种简化的语法,可以使模式匹配表达式更易于阅读,特别是对于嵌套较深的类型。