2012-04-18 44 views
7

Tôi có một vài lớpthừa kế Web API điều khiển API

Square : Rectangle : Shape (abstract) 

và tôi có một bộ điều khiển cơ sở kế thừa từ ApiController mà tôi muốn sử dụng.

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/hình chữ nhật sẽ gọi đúng IEnumerable<Rectangle> Get()

/api/vuông sẽ cho tôi một lỗi:

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 

Nếu tôi thay đổi public new IEnumerable<Square> Get() để public override IEnumerable<Square> Get() , Tôi nhận được một lỗi thời gian biên dịch kể từ khi retur n chữ ký khác nhau

Làm cách nào để mã của tôi gọi đúng phương pháp? Có cần đăng ký một cách rõ ràng các phương thức của mỗi lớp trong RegisterRout không?

Trả lời

1

Bạn cần ghi đè Get, về cơ bản bạn đang sử dụng nó với new. Điều này sẽ không hoạt động vì lớp sẽ có hai phương thức Get và Web API sẽ bị nhầm lẫn để chọn cái nào.

Bạn có thể xác định BaseController như abstractGet như virtual hoặc abstract và sau đó thực hiện trong DerivedController của bạn.

+0

Xin chào Aliostad, tôi đã cập nhật câu hỏi của mình để phản ánh thay đổi của bạn. Tôi vẫn nhận được một số vấn đề ở đây, nhưng đề xuất của bạn là hữu ích cho tôi. Cảm ơn. – khaihon

0

Bạn hiện có hai bộ điều khiển có thể lấy lớp hình vuông của mình. Bạn đăng ký tuyến đường của mình như thế nào? Nếu bạn đổi tên các control thành rectangleController và SquareController thì có lẽ bạn sẽ ổn.

+1

Ngay bây giờ, tôi chỉ có tuyến đường mặc định \t \t \t 'routes.MapHttpRoute (tên:" DefaultApi ", routeTemplate:" api/{controller}/{id} ", mặc định: new {id = RouteParameter.Optional}); 'Trong mã thực tế của tôi, tôi có (RectangleController) và (SquareController) ... nhưng nó vẫn không định tuyến chính xác, cho tôi cùng một thông báo lỗi. – khaihon

Các vấn đề liên quan