我有几个班级
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中明确注册每个类的方法?
答案 0 :(得分:1)
您需要覆盖Get,您基本上将其与new
一起使用。这不会起作用,因为该类将有两个Get方法,而Web API将被混淆以选择哪一个。
您可以将BaseController
定义为abstract
,将Get
定义为virtual
或abstract
,然后在DerivedController
中实施。
答案 1 :(得分:0)
您目前有两个控制器可以使用您的方形类。你是如何注册路线的?如果你将控制器重命名为rectangleController和SquareController,你可能会没事的。