c# - 继承的 Web API API Controller

标签 c# asp.net-mvc-4 asp.net-web-api

我有几个类(class)

Square : Rectangle : Shape (abstract)

我有一个继承自 ApiController 的基础 Controller ,我想使用它。

public abstract class BaseController<T> : ApiController where T : class
{
    public abstract IEnumerable<T> Get()
    ...
}

public class DerivedController : BaseController<Rectangle>
{
    public override IEnumerable<Rectangle> Get()
    ...
}

public class AnotherDerivedController : BaseController<Square>
{
    public new IEnumerable<Square> Get()
    ...
}

/api/rectangle 将正确调用 IEnumerable<Rectangle> Get()

/api/square 会给我一个错误:

Multiple actions were found that match the request: 
System.Linq.IEnumerable`1[Square] Get() on type Web.Api.Controllers.AnotherDerivedController 
System.Linq.IEnumerable`1[Rectangle] Get() on type Web.Api.Controllers.DerivedController

如果我改变 public new IEnumerable<Square> Get()public override IEnumerable<Square> Get() , 由于返回的签名不同,我得到一个编译时错误

如何让我的代码调用正确的方法?是否需要在RegisterRoutes中显式注册每个类的方法?

最佳答案

您需要覆盖 Get,您基本上是将它与 new 一起使用。这是行不通的,因为类将有两个 Get 方法,Web API 会混淆选择哪一个。

您可以将 BaseController 定义为 abstract 并将 Get 定义为 virtualabstract > 然后在您的 DerivedController 中实现。

关于c# - 继承的 Web API API Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10218963/

相关文章:

c# - 如何优雅地处理ViewState错误?

c# - 两个winforms一个模态的对话框情况

c# - 正则表达式缩进 - 将制表符保留在行首

asp.net - MVC 4 中的运行时动态 bundle 和缩小

azure - webapi 不适用于 azure

c# - .NET Core 授权 - JWT Bearer 上的常量 403

c# - "Enable Always on support..."用于通过 C# 或 powershell 的 SSIS

.net - Web 应用程序尝试在 ASP.NET MVC4 应用程序中加载 System.Web.Mvc,版本=1.0.0.0

asp.net-mvc-4 - 访问路径 "/etc/mono/registry"被拒绝

c# - 来自 web api : access_denied error 的谷歌身份验证