写点什么

.NET6 新东西 -- 模式匹配中的 Extended Property Patterns

作者:喵叔
  • 2021 年 12 月 22 日
  • 本文字数:701 字

    阅读完需:约 2 分钟

模式匹配测试的是确定表达式是否具有某些特征的方式。比如我们有 Employee 和 Manager 两个类,其中 Manager 类继承自 Employee:


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);};
复制代码


在.NET6 以前要使用模式匹配来检查变量嵌套的属性的话就比较复杂了,代码如下:


if(obj is Employee { Manager: { Name:"张三", Manager:{ Position: "程序员" } } } employee)
复制代码


但在.NET6 中可以使用引用属性的嵌套成员 Extended Property Patterns(扩展属性模式)。我们把前面的代码修改后是这样的:


if(obj is Employee { Manager.Name:"张三", Manager.Manager.Position: "程序" } employee)
复制代码


使用扩展属性模式不仅仅可以引用类定义的嵌套属性,还可以使用嵌套属性原生类型的属性,代码如下:


if(obj is Employee { Manager.Name.Length:10 } employee)
复制代码


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


TIP:如果任何嵌套属性为 null,都不会出现 NullReferenceException 异常。这是因为编写模式是为了检查对象是否匹配,而不是使用代码直接访问该属性。这就说明如果 Manager 属性为 null,那么模式{Manager.Name:"张三"}不匹配,上面 if 语句的条件计算结果就是 false。

用户头像

喵叔

关注

还未添加个人签名 2020.01.14 加入

还未添加个人简介

评论

发布
暂无评论
.NET6新东西--模式匹配中的Extended Property Patterns