Blazor页面继承自定义抽象类报CS0115 BuildRenderTree无方法可重写
问题原因
- 直接触发CS0115错误的核心原因是:Razor编译器生成的
.g.cs文件默认会为组件生成BuildRenderTree重写方法,如果你仅在后台partial类中指定继承自定义泛型基类,没有在.razor文件顶部显式声明@inherits指令,生成的代码会默认按继承ComponentBase处理,和partial类的继承关系冲突,导致找不到可重写的方法。 - 你的代码还存在2个隐藏问题:
- 泛型基类没有实现
IDisposable接口,你定义的Dispose方法不会被Blazor框架自动调用,无法完成事件解绑 OnInitializedAsync中用匿名lambda注册了PropertyChanged事件,没有对应的解绑逻辑,会引发内存泄漏
- 泛型基类没有实现
解决方案
- 首先在你的
ToDoTest.razor文件顶部添加如下声明,显式指定继承关系:
@inherits MyPage<IToDoViewModel>
- 修正泛型基类的实现,补充
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); } }
- 修正页面后台代码,
Dispose方法不需要手动重写,除非你有额外的释放逻辑:
public partial class ToDoTest : MyPage<IToDoViewModel> { [Inject] public override IToDoViewModel VModel { get; set; } }
完成以上修改后重新编译即可解决CS0115错误,同时也修复了内存泄漏和Dispose不生效的问题。
内容的提问来源于stack exchange,提问作者paburgos
相关产品推荐
相关产品推荐

