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

Blazor页面继承自定义抽象类报CS0115 BuildRenderTree无方法可重写

问题原因
  • 直接触发CS0115错误的核心原因是:Razor编译器生成的.g.cs文件默认会为组件生成BuildRenderTree重写方法,如果你仅在后台partial类中指定继承自定义泛型基类,没有在.razor文件顶部显式声明@inherits指令,生成的代码会默认按继承ComponentBase处理,和partial类的继承关系冲突,导致找不到可重写的方法。
  • 你的代码还存在2个隐藏问题:
    • 泛型基类没有实现IDisposable接口,你定义的Dispose方法不会被Blazor框架自动调用,无法完成事件解绑
    • OnInitializedAsync中用匿名lambda注册了PropertyChanged事件,没有对应的解绑逻辑,会引发内存泄漏
解决方案
  1. 首先在你的ToDoTest.razor文件顶部添加如下声明,显式指定继承关系:
@inherits MyPage<IToDoViewModel>
  1. 修正泛型基类的实现,补充IDisposable接口继承,统一事件注册逻辑,删掉无用的BuildRenderTree重写:
public abstract class MyPage<T> : ComponentBase, IDisposable where T : IToDoViewModel
{
    public abstract T VModel { get; set; }
    protected override async Task OnInitializedAsync()
    {
        // 统一用命名方法注册事件,方便后续解绑
        VModel.PropertyChanged += OnPropertyChangedHandler;
        await base.OnInitializedAsync();
    }

    private async void OnPropertyChangedHandler(object sender, PropertyChangedEventArgs e)
    {
        await InvokeAsync(StateHasChanged);
    }

    // 实现IDisposable接口的Dispose方法
    public void Dispose()
    {
        VModel.PropertyChanged -= OnPropertyChangedHandler;
        GC.SuppressFinalize(this);
    }
}
  1. 修正页面后台代码,Dispose方法不需要手动重写,除非你有额外的释放逻辑:
public partial class ToDoTest : MyPage<IToDoViewModel>
{
    [Inject]
    public override IToDoViewModel VModel { get; set; }
}

完成以上修改后重新编译即可解决CS0115错误,同时也修复了内存泄漏和Dispose不生效的问题。

内容的提问来源于stack exchange,提问作者paburgos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:06:02