C#基类方法如何强制参数类型与调用该方法的子类类型一致
解决方案
你可以通过**奇异递归模板模式(CRTP)**实现该约束,核心是将基类定义为泛型类,强制子类传入自身类型作为泛型参数,具体实现如下:
1. 泛型基类定义
public abstract class BaseFoo<T> where T : BaseFoo<T> { // 方法参数自动约束为子类类型 public void Func(IEnumerable<T> data) { // 原有实现逻辑 } // 统一声明同类型列表成员,子类自动继承对应类型的列表 public List<T> SameTypeList { get; set; } = new List<T>(); // 可选:构造函数加运行时校验,避免子类传错泛型参数 protected BaseFoo() { if (typeof(T) != GetType()) { throw new InvalidOperationException($"子类泛型参数配置错误,需继承自 BaseFoo<{GetType().Name}>"); } } }
2. 子类实现
子类继承时必须传入自身作为泛型参数:
public class Bar : BaseFoo<Bar> { } public class Baz : BaseFoo<Baz> { }
效果验证
此时Bar实例调用Func方法时,入参强制要求为IEnumerable<Bar>,如果传入混合Bar和Baz的数组,编译器会直接报错,完全符合你的约束要求。同时Bar实例的SameTypeList属性类型自动为List<Bar>,Baz实例对应为List<Baz>,也满足你统一声明同类型成员的需求。
内容的提问来源于stack exchange,提问作者William Bradley
相关产品推荐
相关产品推荐

