我定义了一个名为
BaseController
的类,它从ControllerBase
实现,它有一个带有[HttpGet]
的查询函数,当我定义另一个名为UniqueController
的类从BaseController
实现时,然后覆盖查询函数,出现错误:
Actions require an explicit HttpMethod binding for Swagger/OpenAPI 3.0
// basecontroller
public class BaseController<T> : ControllerBase where T : BaseModel, new()
{
[HttpGet]
public virtual async Task<IActionResult> Query()
{
var models = await _baseService.QueryModelAsync();
return Ok(ApiResultHelper.Success("Success", new { Value = models }, models.Count));
}
}
// uniquecontroller
public class UniqueController<T> : BaseController<T> where T : UniqueModel, new()
{
public new async Task<IActionResult> Query()
{
var models = await _modelService.QueryModelAsync();
return Ok(ApiResultHelper.Success("Success", new { Value = models }, models.Count));
}
}
// module controller use
public class UserController : UniqueController<UserModel>
{
public UserController(UniqueService<UserModel> modelService, IHttpContextAccessor httpContextAccessor)
: base(modelService, httpContextAccessor) {}
}
这是因为你用
new
关键字隐藏了方法。
您需要使用
override
来定义它。
从纯语言角度思考,
new
隐藏了方法,意味着同一个方法会有两个版本。考虑简单的例子:
public class Base
{
public virtual void VirtualMethod()
{
Console.WriteLine("Calling base virtual method");
}
}
public class UniqueWithNew : Base
{
public new virtual void VirtualMethod()
{
Console.WriteLine("Calling UniqueWithNew method");
}
}
public class UserWithNew : UniqueWithNew { }
以及示例程序:
var userWithNew = new UserWithNew();
userWithNew.VirtualMethod();
Base @base = userWithNew;
Console.WriteLine("Calling user with new as Base: ");
@base.VirtualMethod();
每次
VirtualMethod()
调用都会返回不同的结果,因为它们是两种不同的方法。
Swagger 也会检测这两种方法,它们都具有
HttpGet
属性,并且会感到困惑。