.NET项目使用Xero SDK调用GetEmployeeAsync报类型转换错误如何解决
解决方案
问题根因
- 异步调用用法错误:你直接调用异步方法的
.Result属性,属于阻塞式调用,既存在线程死锁风险,也可能干扰类型转换逻辑 - 返回类型不匹配:
GetEmployeeAsync接口返回的响应对象中_Employees是List<Employee>类型的员工集合,你尝试直接将集合赋值给单个Employee类型的返回值,因此抛出类型转换错误
修复代码
using System.Linq; // 需引入Linq命名空间来调用FirstOrDefault方法 public XeroAuth _xeroAuth; public PayrollAuApi ipayrollAUApi = new PayrollAuApi(); private Xero.NetStandard.OAuth2.Model.PayrollAu.Employee _GetEmpLeave; // 获取指定员工的全量数据 private async Task<Xero.NetStandard.OAuth2.Model.PayrollAu.Employee> GetEmployeeAsync(Guid syncedEmpID) { var tokens = await _xeroAuth.GetXeroTokenAuthorization(); _tenantUniqueId = tokens.Item3; try { // 正确await异步方法,避免使用.Result阻塞调用 var response = await ipayrollAUApi.GetEmployeeAsync(tokens.Item1, tokens.Item2, syncedEmpID); // 传入指定员工ID的场景下,集合只会有一个匹配结果,取首条返回即可 return response._Employees.FirstOrDefault(); } catch (Exception ex) { logging.LoggingToText(ex, await _Context.GetAssemblyInfoAsync(4)); return null; } }
额外说明
- 如果查询的员工ID不存在,
FirstOrDefault()会直接返回null,和你原有代码的异常处理逻辑兼容 - 不要混用
await和.Result,异步方法全程用await调用可以避免绝大多数线程上下文问题
内容的提问来源于stack exchange,提问作者Asanka Yaparathna
相关产品推荐
相关产品推荐

