8

私はいくつかのクラスを持っています

Square : Rectangle : Shape (abstract)

そして、使用したい ApiController から継承する Base Controller があります。

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ます。クラスには 2 つの Get メソッドがあり、Web API はどれを選択するか混乱するため、これは機能しません。

BaseControllerasabstractおよびGetasvirtualまたはを定義してからabstract、 に実装できますDerivedController

于 2012-04-18T22:49:55.013 に答える