2012-04-18 27 views
7

tengo un par de clasesheredada controlador API API Web

Square : Rectangle : Shape (abstract) 

y tengo un controlador base heredando de ApiController que me gustaría utilizar.

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

y

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

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

/api/rectángulo llamar adecuadamente IEnumerable<Rectangle> Get()

/api/cuadrado me dará un error:

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 

Si cambio public new IEnumerable<Square> Get() a public override IEnumerable<Square> Get() , Obtengo un error de tiempo de compilación desde el retorno n firmas son diferentes

¿Cómo obtengo mi código para llamar al método correcto? ¿Es necesario registrar explícitamente los métodos de cada clase en RegisterRoutes?

Respuesta

1

Debe sobrescribir el Get, básicamente lo está usando con new. Esto no va a funcionar, ya que la clase tendrá dos métodos Get y la API web se confundirá para elegir cuál.

Es posible definir el BaseController como abstract y Get como virtual o abstract y luego implementar en su DerivedController.

+0

Hola Aliostad, actualicé mi pregunta para reflejar sus cambios. Todavía tengo algunos problemas aquí, pero tus sugerencias fueron útiles para mí. Gracias. – khaihon

0

Actualmente tiene dos controladores que pueden tomar su clase cuadrada. ¿Cómo estás registrando tus rutas? Si cambias el nombre de los controladores a rectangleController y SquareController probablemente estarás bien.

+1

Ahora mismo, solo tengo la ruta predeterminada \t \t \t 'routes.MapHttpRoute (nombre:" DefaultApi ", routeTemplate:" api/{controller}/{id} ", por defecto: new {id = RouteParameter.Optional}); 'En mi código actual, tengo (RectangleController) y (SquareController) ... pero todavía no está enrutando correctamente, dándome el mismo mensaje de error. – khaihon