首页 > 解决方案 > 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”

第一个代码如何工作而第二个代码不工作?如何从没有公共基类型的对象转换返回类型?

标签: c#asp.net-core

解决方案


以下两个隐式运算符来自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>另一个运算符的有效值,反之亦然。


推荐阅读