如何将OkObjectResult类型的返回结果转换为指定Model实体类型
问题原因
GetById方法的返回值是IActionResult类型,你返回的Ok(returnObj)实际是把Model实体封装到了OkObjectResult对象中,并不是直接返回Model本身,所以直接强制转换会报错。
可行解决方案
方案1:直接从OkObjectResult中提取实体
你可以先判断返回结果的类型,再从OkObjectResult的Value属性中取出对应的Model实体:
public IActionResult AnotherMethod(int Id) { var actionResult = GetById(Id); // 先校验返回结果是否是成功的OkObjectResult if (actionResult is OkObjectResult okResult) { var data = okResult.Value as Model; if (data != null) { // 此处可正常使用data对象执行业务逻辑 // ... return Ok(returnObj); } } // 处理GetById返回非200状态的场景,比如资源不存在、参数错误等 return NotFound(); }
方案2(更推荐):抽离公共业务逻辑,避免Controller Action互相调用
你可以把两个方法共用的查询逻辑抽成独立的私有方法或者服务层方法,完全不需要做类型转换,还能降低代码耦合度:
// 抽离公共的Model查询逻辑 private Model GetModelById(int Id) { // 原GetById方法中的数据查询逻辑 ... return returnObj; } // 原GetById方法直接调用抽离后的逻辑 public IActionResult GetById(int Id) { var model = GetModelById(Id); if (model == null) { return NotFound(); } return Ok(model); } // AnotherMethod也直接调用公共逻辑,无需处理ActionResult转换 public IActionResult AnotherMethod(int Id) { var data = GetModelById(Id); if (data == null) { return NotFound(); } // 执行业务逻辑 ... return Ok(returnObj); }
这种方案后续维护性更高,即使后续GetById新增了权限校验、参数校验等逻辑,也不会影响到业务层对核心查询逻辑的调用。
内容的提问来源于stack exchange,提问作者XenDex
相关产品推荐
相关产品推荐

