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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:54:06