C#中如何通过单个变量实现多类型条件类型检查
如何在C#中匹配多种类型并将结果赋值到单个变量
嘿,我完全懂你的需求——就是想让输入对象只要匹配上某几种类型中的任意一种,就能把它存到同一个变量里直接用,不用分开写多个if分支对吧?
可惜的是,C#目前并不支持像if(input is typeOne OR typeTwo inputType)这种直接的语法,因为编译器没法确定inputType的具体类型(毕竟两种类型可能没有共同基类)。不过咱们有几种替代方案可以实现类似的效果:
1. 利用共同基类/接口(最优解,如果适用的话)
如果TypeOne和TypeTwo继承自同一个基类,或者实现了同一个接口,那事情就简单了。你可以直接把变量声明为这个共同类型:
// 假设TypeOne和TypeTwo都继承自BaseType if (input is BaseType inputType) { // 这里可以直接调用BaseType里的方法/属性 inputType.CommonMethod(); }
这种方式最干净,不需要额外的转换,类型也安全。
2. 使用Switch语句/表达式(通用方案)
如果两种类型没有共同的基类/接口,switch是最灵活的选择。你可以在switch里匹配多种类型,然后统一处理:
Switch语句版本
if (input is not null) { switch (input) { case TypeOne t1: case TypeTwo t2: // 这里可以根据情况把t1或t2赋值给变量 // 如果不需要区分类型,直接用object或者动态类型(不推荐动态) var inputType = t1 ?? (object)t2; // 处理逻辑 Console.WriteLine(inputType.ToString()); break; default: // 不匹配的情况 break; } }
Switch表达式版本(更简洁)
var inputType = input switch { TypeOne t => t, TypeTwo t => t, _ => null // 或者抛出InvalidOperationException之类的异常 }; if (inputType != null) { // 使用inputType }
这里编译器会自动推断inputType的类型:如果TypeOne和TypeTwo有共同类型,就用那个类型;否则就是object。
3. 结合var模式和逻辑检查(凑合用的方案)
这种方式虽然能实现,但类型是object,后续可能需要强制转换,不如前两种优雅:
if (input is var inputType && (inputType is TypeOne || inputType is TypeTwo)) { // 这里inputType是object类型,需要的话得转换 if (inputType is TypeOne t1) { t1.TypeOneMethod(); } else if (inputType is TypeTwo t2) { t2.TypeTwoMethod(); } }
总结一下,优先用共同基类/接口的方案,不行就用switch语句/表达式,这两种是最常用也最靠谱的解决办法。
内容的提问来源于stack exchange,提问作者TheMo
相关产品推荐
相关产品推荐

