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

C# 如何实现支持不同接口类型参数的可复用规则检查器?

规则检查器实现问题解决方案

问题根因

你当前的写法错误原因是重写泛型方法时,<ITimeValued>、<ICounterValued>被识别为泛型参数的名称,而非你预先定义的接口类型,编译器无法识别该泛型参数具备对应接口的属性,因此编译报错。

解决方案

方案1:最小改动兼容现有架构

不需要调整整体设计,仅修改具体规则类的UpdateMe实现即可,运行时通过模式匹配校验传入对象是否实现规则所需的接口:

public class TimeRule : Rule {
    public override void UpdateMe<T>(T data)
    {
        // 运行时判断传入对象是否实现ITimeValued接口
        if (data is ITimeValued timeData)
        {
            _triggered = timeData.ElapsedTime >= timeData.TimeLimit;
        }
        // 不匹配的情况下保持_triggered为false,也可根据业务需求自定义处理逻辑
    }
}

public class CounterRule : Rule {
    public override void UpdateMe<T>(T data)
    {
        if (data is ICounterValued counterData)
        {
            _triggered = counterData.CounterValue >= counterData.CounterLimit;
        }
    }
}

该方案优势:

  • 完全符合你预设的架构逻辑:主类可自由实现任意数量的接口,新增规则仅需继承Rule类、匹配对应接口即可,现有代码无需改造
  • 规则和主类完全解耦,单个规则仅关心自身需要的接口,不依赖主类的具体实现
  • 保留原有泛型方法的结构,改动量极小,可直接兼容现有业务代码

方案2:优化架构降低后续维护成本

如果希望新增规则时不用重复写类型判断逻辑,可以将泛型约束上移到Rule类层级,配合非泛型基类实现列表统一存储:

// 非泛型基类,用于统一存入规则列表
public abstract class Rule {
    protected bool _triggered;
    public virtual bool IsTriggered() => _triggered;
    public abstract void UpdateMe(object data);
}

// 泛型规则类,统一处理类型匹配逻辑
public abstract class Rule<T> : Rule
{
    public sealed override void UpdateMe(object data)
    {
        if (data is T typedData)
        {
            UpdateTyped(typedData);
        }
    }
    // 子类仅需要实现业务逻辑即可
    protected abstract void UpdateTyped(T data);
}

// 具体规则实现
public class TimeRule : Rule<ITimeValued>
{
    protected override void UpdateTyped(ITimeValued data)
    {
        _triggered = data.ElapsedTime >= data.TimeLimit;
    }
}

public class CounterRule : Rule<ICounterValued>
{
    protected override void UpdateTyped(ICounterValued data)
    {
        _triggered = data.CounterValue >= data.CounterLimit;
    }
}

// RuleChecker同步调整CheckRules方法即可
public class RuleChecker {
    public List<Rule> rules = new List<Rule>();

    public void CheckRules(object data){
        rules.ForEach(x => x.UpdateMe(data));
    }

    public bool SomeRuleTriggered(){
        return rules.Any(x => x.IsTriggered());
    }
}

内容的提问来源于stack exchange,提问作者Rob-dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:36:07