2012-04-18 211 views
7

我有几个类继承的Web API 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 /矩形将正确地调用IEnumerable<Rectangle> Get()

/API /平方米会给我一个错误:

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() ,自返回以来,我收到编译时错误n个签名不同

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

回答

1

你需要重写获取,你基本上使用它与new。这是不行的,因为这个类将有两个Get方法,并且Web API将被混淆以选择哪一个。

您可以定义为BaseControllerabstractGetvirtualabstract然后在DerivedController实现。

+0

嗨Aliusad,我更新了我的问题,以反映您的更改。我在这里仍然遇到一些问题,但你的建议对我有帮助。谢谢。 – khaihon 2012-04-19 00:04:05

0

你目前有两个控制器,可以把你的方形课。你如何注册你的路线?如果您将控制器重命名为rectangleController和SquareController,则您可能会很好。

+1

现在,我只有默认路由\t \t \t'routes.MapHttpRoute(name:“DefaultApi”,routeTemplate:“api/{controller}/{id}”,默认值:new {id = RouteParameter.Optional}); '在我的实际代码中,我确实有(RectangleController)和(SquareController)...但它仍然没有正确路由,给我相同的错误信息。 – khaihon 2012-04-19 21:10:39