c# - ASP.NET Core 如何将任何类型转换为 ActionResult控制器动作的返回类型?
问题描述
我在 ASP.NET Core 2.2 的 WebApi 控制器中有一个简单的操作,如下所示:
[HttpGet("test123")]
public ActionResult<string> Test123()
{
return new OkResult();
}
这编译得很好,但我想知道OkResult
对象如何转换为ActionResult<string>
?
这些类有不同的继承链:
OkResult -> StatusCodeResult -> ActionResult
while ActionResult<TValue>
only implementsIConvertToActionResult
换句话说,ActionResult<string>
不是OkResult
类的基类型。
如果我手动执行此操作并将代码更改为:
[HttpGet("test123")]
public ActionResult<string> Test123()
{
var a = new OkResult();
var b = a as ActionResult<string>; // Error CS0039
return b;
}
代码不会因转换错误而编译:
错误 CS0039:无法通过引用转换、装箱转换、拆箱转换、包装转换或空类型转换将类型“Microsoft.AspNetCore.Mvc.OkResult”转换为“Microsoft.AspNetCore.Mvc.ActionResult”
第一个代码如何工作而第二个代码不工作?如何从没有公共基类型的对象转换返回类型?
解决方案
以下两个隐式运算符来自ActionResult<TValue>
/// <summary>
/// Implictly converts the specified <paramref name="value"/> to an <see cref="ActionResult{TValue}"/>.
/// </summary>
/// <param name="value">The value to convert.</param>
public static implicit operator ActionResult<TValue>(TValue value)
{
return new ActionResult<TValue>(value);
}
/// <summary>
/// Implictly converts the specified <paramref name="result"/> to an <see cref="ActionResult{TValue}"/>.
/// </summary>
/// <param name="result">The <see cref="ActionResult"/>.</param>
public static implicit operator ActionResult<TValue>(ActionResult result)
{
return new ActionResult<TValue>(result);
}
是什么允许在操作中使用多种返回类型。
[HttpGet("test123")]
public ActionResult<string> Test123() {
if(someCondition) return "String value"; //<--String
return Ok(); //<-- OkResult
}
当返回字符串时,将ActionResult<TValue>(TValue value)
调用运算符,返回ActionResult<TValue>
另一个运算符的有效值,反之亦然。
推荐阅读
- spring - docker compose 的正确端点
- azure - QueueTrigger 没有选择消息 - Azure WebJobs SDK 3.0
- javascript - 使用配对选择框的输出在网页上显示特定图像
- javascript - 将变量从 Flask 导入网页而不重新加载
- emscripten - 如何将字符串从 emscripten/webassembly 函数返回给 ac 调用者
- javascript - 相对于当前位置在画布中一起移动多个对象
- android - React-Native:gradlew build 产生:react-native-fbsdk:lint 错误“库必须使用完全相同的版本”
- c# - 获取引用方法的程序集名称
- python - pivot_table() 到 df 没有要聚合的数字类型
- python - 合并具有不一致键的多个字典