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
相关产品推荐
相关产品推荐

