2012-04-18 4 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() 
    ... 
} 

/апи/прямоугольник будет правильно называть IEnumerable<Rectangle> Get()

/апи/квадрат дает мне ошибку:

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() , Я получаю ошибку времени компиляции, так как retur n подписи различны

Как мне получить код для вызова надлежащего метода? Нужно ли явно регистрировать методы каждого класса в RegisterRoutes?

ответ

1

Вам необходимо переопределить Get, вы в основном используете его с new. Это не сработает, так как класс будет иметь два метода Get, а Web API будет смущен, чтобы выбрать, какой из них.

Вы можете определить, как BaseControllerabstract и Get в virtual или abstract, а затем реализовать в вашем DerivedController.

+0

Привет, Aliostad, я обновил свой вопрос, чтобы отразить ваши изменения. У меня все еще есть проблемы, но ваши предложения были полезны для меня. Благодарю. – khaihon

0

В настоящее время у вас есть два контроллера, которые могут принимать ваш квадратный класс. Как вы регистрируете свои маршруты? Если вы переименуете контроллеры в rectangleController и SquareController, вы, вероятно, будете в порядке.

+1

Прямо сейчас у меня только есть маршрут по умолчанию \t \t \t 'routes.MapHttpRoute (name:" DefaultApi ", routeTemplate:" api/{controller}/{id} ", defaults: new {id = RouteParameter.Optional}); 'В моем фактическом коде у меня есть (RectangleController) и (SquareController) ... но он по-прежнему не корректно маршрутизируется и дает мне такое же сообщение об ошибке. – khaihon

Смежные вопросы