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

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生态里管理服务实例的最佳实践,步骤如下:

  1. 先确保AutorService已经在DI容器中注册(比如在Program.cs里添加:builder.Services.AddScoped<AutorService>();)
  2. 在你的组件/页面类中通过构造函数注入服务实例:
    private readonly AutorService _autorService;
    
    // 构造函数注入服务
    public YourComponentOrPageName(AutorService autorService)
    {
        _autorService = autorService;
    }
    
  3. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:25:54