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

C#中如何正确处理拥有不同参数的Task派生类

错误原因

你原来的写法仅完成了类型匹配,但没有将匹配成功的实例赋值给对应派生类的变量,switch块内的Task变量仍然是父类Task类型,自然访问不到派生类独有的属性。

正确实现方式

方案1:使用带变量声明的类型模式匹配(快速适配现有代码)

直接在case语句中声明对应派生类的变量,匹配成功后直接用该变量访问独有属性,修改后的代码如下:

foreach (Task task in this.Tasks)
{
    switch (task)
    {
        case FixedTask fixedTask:
            switch (fixedTask.Frequency)
            {
                case "Daily":
                    // 执行FixedTask Daily类型的工作量计算
                    break;
                // 其他Frequency分支
            }
            break;
        case RelativeTask relativeTask:
            // 访问RelativeTask的独有属性执行计算
            break;
        // 其他Task派生类分支
    }
}

方案2:面向对象多态实现(更推荐,符合开闭原则)

如果后续还会新增更多Task派生类,建议直接用多态实现,避免后续不断扩充switch分支:

  1. 首先在父类Task中定义抽象的工作量计算方法:
public abstract class Task
{
    // 其他公共属性/方法
    public abstract decimal CalculateWorkload();
}
  1. 两个派生类各自实现自己的计算逻辑:
public class FixedTask : Task
{
    public string Frequency { get; set; }
    // 其他独有属性

    public override decimal CalculateWorkload()
    {
        return Frequency switch
        {
            "Daily" => /* 对应计算逻辑 */,
            "Weekly" => /* 对应计算逻辑 */,
            _ => /* 默认逻辑 */
        };
    }
}

public class RelativeTask : Task
{
    // 独有属性
    public override decimal CalculateWorkload()
    {
        // 实现RelativeTask对应的计算逻辑
    }
}
  1. 遍历的时候直接调用方法即可,不需要判断类型:
decimal totalWorkload = 0;
foreach (Task task in this.Tasks)
{
    totalWorkload += task.CalculateWorkload();
}

内容的提问来源于stack exchange,提问作者FenryrMKIII

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:36:07