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

如何为异步方法实现类似out参数功能?简化Blazor初始化代码

实现可行方案

你可以通过封装一个遵循.NET「Try模式」的异步方法,结合空值分析特性来实现需求,既能简化重复代码,又能保证_user的非空性避免警告。

步骤1:封装TryGetUserAsync方法

将用户检查和导航逻辑封装成扩展方法(或注入服务的方法),利用[NotNullWhen(true)]特性告诉编译器:当方法返回true时,out参数的用户对象非空。

using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Components;

public static class UserManagerExtensions
{
    public static async Task<bool> TryGetUserAsync(
        this UserManager<User> userManager,
        ClaimsPrincipal principal,
        NavigationManager navigation,
        [NotNullWhen(true)] out User user)
    {
        user = await userManager.GetUserAsync(principal);
        
        if (user == null)
        {
            navigation.NavigateTo(GlobalConstants.UrlLogIn, true);
            user = null!; // 仅用于满足编译器赋值要求,调用方返回false时不会使用该值
            return false;
        }

        return true;
    }
}

步骤2:调用简化后的方法

在OnInitializedAsync中直接调用该方法,判断返回值即可,_user会被自动推断为非空类型:

protected override async Task OnInitializedAsync()
{
    if (!await UserManager.TryGetUserAsync(Principal, Navigation, out var _user))
    {
        return;
    }

    // 后续直接使用非空的_user,无空值警告
    // 示例:var userName = _user.UserName;
}

关键说明

  • [NotNullWhen(true)]特性需要引用System.Diagnostics.CodeAnalysis命名空间,它是.NET空值分析的核心特性,能让编译器识别出out参数的非空条件。
  • 方法遵循.NET标准的Try模式(如int.TryParse),调用方代码简洁直观,符合开发者的使用习惯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:33:31