继承的Web API API控制器

kha*_*hon 8 c# asp.net-mvc-4 asp.net-web-api

我有几堂课

Square : Rectangle : Shape (abstract)
Run Code Online (Sandbox Code Playgroud)

我有一个继承自ApiController的基本控制器,我想使用它.

public abstract class BaseController<T> : ApiController where T : class
{
    public abstract IEnumerable<T> Get()
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

public class AnotherDerivedController : BaseController<Square>
{
    public new IEnumerable<Square> Get()
    ...
}
Run Code Online (Sandbox Code Playgroud)

/ 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
Run Code Online (Sandbox Code Playgroud)

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

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

Ali*_*tad 1

您需要重写 Get,您基本上将其与new. 这是行不通的,因为该类将有两个 Get 方法,而 Web API 将难以选择哪一个。

您可以定义BaseControllerasabstractGetas virtualorabstract然后在您的DerivedController.