8

我有几节课

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/rectangle 将正确调用IEnumerable<Rectangle> Get()

/api/square 会给我一个错误:

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(),我会收到编译时错误,因为返回签名不同

如何让我的代码调用正确的方法?是否需要在 RegisterRoutes 中显式注册每个类的方法?

4

2 回答 2

1

您需要覆盖 Get,您基本上是与new. 这是行不通的,因为该类将有两个 Get 方法,并且 Web API 会混淆选择哪一个。

您可以定义BaseControllerasabstractGetas virtualorabstract然后在您的DerivedController.

于 2012-04-18T22:49:55.013 回答
0

您目前有两个控制器可以使用您的 square 类。你是如何注册你的路线的?如果您将控制器重命名为 rectangleController 和 SquareController ,您可能会没事的。

于 2012-04-19T14:21:05.490 回答