如何为异步方法实现类似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
相关产品推荐
相关产品推荐

