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分支:
- 首先在父类
Task中定义抽象的工作量计算方法:
public abstract class Task { // 其他公共属性/方法 public abstract decimal CalculateWorkload(); }
- 两个派生类各自实现自己的计算逻辑:
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对应的计算逻辑 } }
- 遍历的时候直接调用方法即可,不需要判断类型:
decimal totalWorkload = 0; foreach (Task task in this.Tasks) { totalWorkload += task.CalculateWorkload(); }
内容的提问来源于stack exchange,提问作者FenryrMKIII
相关产品推荐
相关产品推荐

