.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这种简化的语法,可以使模式匹配表达式更易于阅读,特别是对于嵌套较深的类型。