2012-04-18 122 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