如何在C#方法中实现返回两种不同类型的结果
方案说明
C# 是强类型语言,方法返回值类型必须固定,你原来的写法定义返回类型为IEnumerable<Utilisateur>,自然无法返回字符串类型的错误信息。这类「成功返回业务数据、失败返回错误信息」的场景,行业通用做法是用泛型结果包装类实现,泛型在这里的作用是让同一个包装类可以适配不同类型的返回数据,同时保证编译期类型安全,不需要手动做类型转换。
第一步:定义通用泛型结果包装类
public class ServiceResult<T> { /// <summary> /// 操作是否成功 /// </summary> public bool IsSuccess { get; set; } /// <summary> /// 成功时返回的业务数据,类型和传入的泛型参数一致 /// </summary> public T? Data { get; set; } /// <summary> /// 失败时的错误提示 /// </summary> public string? ErrorMessage { get; set; } // 封装快捷构造方法,减少重复代码 public static ServiceResult<T> Success(T data) => new() { IsSuccess = true, Data = data }; public static ServiceResult<T> Fail(string errorMsg) => new() { IsSuccess = false, ErrorMessage = errorMsg }; }
第二步:修改你的服务方法返回值和逻辑
把方法返回值从Task<IEnumerable<Utilisateur>>替换为Task<ServiceResult<IEnumerable<Utilisateur>>>即可:
public async Task<ServiceResult<IEnumerable<Utilisateur>>> AllUtilisateur(FormUserDTO formUserDTO) { // 这里替换为你实际的用户查询逻辑 IEnumerable<Utilisateur>? user = await GetUsersFromDb(formUserDTO); if(user != null) { // 正常场景返回用户列表 return ServiceResult<IEnumerable<Utilisateur>>.Success(user); } // 异常场景返回错误信息 return ServiceResult<IEnumerable<Utilisateur>>.Fail("未查询到匹配的用户数据"); }
第三步:调用方法的示例
var result = await userService.AllUtilisateur(formDto); if(result.IsSuccess) { // 直接拿到强类型的用户列表,不需要类型转换 IEnumerable<Utilisateur> userList = result.Data; // 处理正常业务逻辑 } else { // 取错误信息做提示 string error = result.ErrorMessage; // 处理错误逻辑 }
泛型逻辑简单说明
你定义ServiceResult<T>时T是类型占位符,当你指定T为IEnumerable<Utilisateur>时,编译器会自动生成对应类型的实体类,Data属性的类型就固定为IEnumerable<Utilisateur>,编译阶段就会做类型校验,既保证了通用性(其他返回List<Role>、int之类的方法也可以复用这个包装类),又避免了运行时类型转换错误。
内容的提问来源于stack exchange,提问作者Péah
相关产品推荐
相关产品推荐

