C#中如何结合OR条件使用is运算符进行模式匹配?
合并C#中多个is运算符的判断逻辑方案
1. C# 9及以上版本:使用OR模式匹配
你可以直接通过or关键字合并多个类型的is判断,不过由于Hoo1和Hoo2是不同类型,编译器无法直接识别它们的共同属性,需要先统一访问方式:
if (foo.Goo is Hoo1 hoo1 or Hoo2 hoo2) { // 通过类型转换或接口统一访问属性 var target = hoo1 as IHasSomeProperty ?? hoo2 as IHasSomeProperty; target.someProperty = ...; } else { // 其他分支逻辑 }
2. 更推荐的方案:提取公共接口
既然Hoo1和Hoo2拥有相同的someProperty属性,最优雅的做法是定义一个公共接口,让两个类实现该接口:
// 定义公共接口 public interface IHasSomeProperty { // 根据实际属性类型调整 string someProperty { get; set; } } // 让Hoo1和Hoo2实现接口 public class Hoo1 : IHasSomeProperty { public string someProperty { get; set; } // 其他成员 } public class Hoo2 : IHasSomeProperty { public string someProperty { get; set; } // 其他成员 }
之后判断逻辑可以大幅简化:
if (foo.Goo is IHasSomeProperty target) { target.someProperty = ...; } else { // 其他分支逻辑 }
这种方式既符合面向对象设计原则,也让代码更易维护——后续新增同类别的类时,只需实现接口即可,无需修改判断逻辑。
3. 兼容C# 8及以下版本
如果使用的是旧版本C#,无法使用or模式,依然可以通过接口统一类型来简化代码:
var target = foo.Goo as IHasSomeProperty; if (target != null) { target.someProperty = ...; } else { // 其他分支逻辑 }
若不想定义接口,只能保留原有的分支判断结构,但代码冗余度会更高。
内容的提问来源于stack exchange,提问作者Yogi_Bear
相关产品推荐
相关产品推荐

