2012-04-18 15 views
7

Ich habe ein paar KlassenInherited Web API API-Controller

Square : Rectangle : Shape (abstract) 

und ich habe eine Basissteuerung von ApiController vererben, die ich verwenden möchten.

public abstract class BaseController<T> : ApiController where T : class 
{ 
    public abstract IEnumerable<T> Get() 
    ... 
} 

und

public class DerivedController : BaseController<Rectangle> 
{ 
    public override IEnumerable<Rectangle> Get() 
    ... 
} 

public class AnotherDerivedController : BaseController<Square> 
{ 
    public new IEnumerable<Square> Get() 
    ... 
} 

/api/Rechteck rufen richtig IEnumerable<Rectangle> Get()

/api/Quadrat gibt mir eine Fehlermeldung:

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 

Wenn ich public new IEnumerable<Square> Get() zu public override IEnumerable<Square> Get() ändern , Bekomme ich einen Kompilierfehler seit der Rückkehr n Signaturen sind unterschiedlich

Wie bekomme ich meinen Code, um die richtige Methode aufzurufen? Ist es notwendig, die Methoden jeder Klasse explizit in RegisterRoutes zu registrieren?

Antwort

1

Sie müssen das Get überschreiben, Sie verwenden es im Grunde mit new. Das wird nicht funktionieren, da die Klasse zwei Get-Methoden haben wird und die Web-API verwirrt sein wird, um welche auszuwählen.

können Sie definieren die BaseController als abstract und Get als virtual oder abstract und dann in Ihrem DerivedController zu implementieren.

+0

Hallo Aliostad, ich habe meine Frage aktualisiert, um Ihre Änderungen zu reflektieren. Ich habe immer noch Probleme, aber Ihre Vorschläge waren hilfreich für mich. Vielen Dank. – khaihon

0

Sie haben derzeit zwei Controller, die Ihre Square-Klasse aufnehmen können. Wie registrierst du deine Routen? Wenn Sie die Controller zu rectangleController und SquareController umbenennen, werden Sie wahrscheinlich in Ordnung sein.

+1

Im Moment habe ich nur die Standardroute \t \t \t 'routes.MapHttpRoute (Name:" DefaultApi ", routeTemplate:" api/{Controller}/{ID} ", Standard: neu {ID = RouteParameter.Optional}); 'In meinem eigentlichen Code habe ich (RectangleController) und (SquareController) ... aber es ist immer noch nicht richtig Routing, mir die gleiche Fehlermeldung. – khaihon