C#新手求助:调用AutorService.GetAllAutorsAsync()出现非静态引用错误
解决"An object reference is required..."错误的方案
嘿,作为C#新手遇到这个问题太正常了,我来帮你理清原因和解决办法!
问题根源
这个错误的核心很简单:你想通过类名AutorService直接调用GetAllAutorsAsync()方法,但这个方法是非静态方法——非静态方法必须通过类的实例对象才能调用,不能直接用类名触发。
先回顾你的代码
先看你页面/组件里的调用代码:
[Bind(Direction.ServerToClient)] public List<AutorListModel> Autors { get; set; } public override async Task PreRender() { // 这里直接用类名调用非静态方法,就是报错的原因 Autors = await AutorService.GetAllAutorsAsync(); await base.PreRender(); }
对应的服务代码:
public async Task<List<AutorListModel>> GetAllAutorsAsync() { using (var dbContext = CreateDbContext()) { return await dbContext.Autors.Select(s => new AutorListModel { Id = s.Id, Jmeno = s.Jmeno, Prijmeni = ... }).ToListAsync(); } }
两种常见解决方案
方案1:依赖注入(推荐,适用于Blazor/ASP.NET Core等现代.NET场景)
依赖注入是.NET生态里管理服务实例的最佳实践,步骤如下:
- 先确保
AutorService已经在DI容器中注册(比如在Program.cs里添加:builder.Services.AddScoped<AutorService>();) - 在你的组件/页面类中通过构造函数注入服务实例:
private readonly AutorService _autorService; // 构造函数注入服务 public YourComponentOrPageName(AutorService autorService) { _autorService = autorService; } - 修改
PreRender方法,用注入的实例调用方法:public override async Task PreRender() { Autors = await _autorService.GetAllAutorsAsync(); await base.PreRender(); }
方案2:手动创建实例(适合简单测试或无DI的场景)
如果你的项目没用到依赖注入,可以手动创建AutorService的实例来调用方法:
public override async Task PreRender() { // 创建服务实例(注意:如果AutorService的构造函数需要参数,要传入对应值) var autorService = new AutorService(); Autors = await autorService.GetAllAutorsAsync(); await base.PreRender(); }
额外小提示
优先选依赖注入的方式哦,它能帮你自动管理对象的生命周期,还能让代码更容易测试和维护。
内容的提问来源于stack exchange,提问作者Vojtěch Giesl
相关产品推荐
相关产品推荐

