2012-04-18 26 views
7

は、私はクラス 継承されたWeb APIのAPIコントローラ

Square : Rectangle : Shape (abstract) 

のカップルを持っていると私は私が使用したいApiControllerから継承ベースコントローラを持っています。

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 override IEnumerable<Square> Get()public new IEnumerable<Square> Get()を変更する場合:

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 /矩形は適切IEnumerable<Rectangle> Get()

/API /平方は私にエラーを与える呼びます、私はコンパイル時のエラーを得るn個の署名が異なる

コードを適切な方法で呼び出すにはどうすればよいですか? RegisterRoutesに各クラスのメソッドを明示的に登録する必要がありますか?

答えて

1

Getをオーバーライドする必要があります。基本的にはnewで使用しています。クラスには2つのGetメソッドがあり、Web APIはどちらを選択するのか混乱するため、これはうまくいきません。

あなたはvirtualまたはabstractとしてabstractGetとしてBaseControllerを定義し、あなたのDerivedControllerに実装することができます。

+0

こんにちはAliostad、私はあなたの変更を反映するために私の質問を更新しました。私はまだここにいくつかの問題を抱えていますが、あなたの提案は私にとって有益でした。ありがとう。 – khaihon

0

現在、スクエアクラスを使用できるコントローラは2つあります。あなたのルートはどのように登録していますか?あなたが制御器の名前をrectangleControllerとSquareControllerに変更すると、おそらく問題ありません。

+1

現在、既定のルートを持っています。\t \t \t 'routes.MapHttpRoute(name:" DefaultApi "、routeTemplate:" api/{コントローラ}/{id} "、デフォルト:new {id = RouteParameter.Optional}); '私の実際のコードでは、私は(RectangleController)と(SquareController)を持っています...しかし、それは私に同じエラーメッセージを与え、まだ正しくルーティングされていません。 – khaihon

関連する問題