继承的Web API API控制器

时间:2012-04-18 22:23:06

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

我有几个班级

Square : Rectangle : Shape (abstract)

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

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中明确注册每个类的方法?

2 个答案:

答案 0 :(得分:1)

您需要覆盖Get,您基本上将其与new一起使用。这不会起作用,因为该类将有两个Get方法,而Web API将被混淆以选择哪一个。

您可以将BaseController定义为abstract,将Get定义为virtualabstract,然后在DerivedController中实施。

答案 1 :(得分:0)

您目前有两个控制器可以使用您的方形类。你是如何注册路线的?如果你将控制器重命名为rectangleController和SquareController,你可能会没事的。