You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 06:07:43