私は次のようなインターフェース契約を結んでいます:
ICollection<FooBar> FindByPredicate(Expression<Func<FooBar,bool>> predicate);
ICollection<Foo> FindByPredicate(Expression<Func<Foo,bool>> predicate);
ICollection<Bar> FindByPredicate(Expression<Func<Bar,bool>> predicate);
FooとBarは、FooBar抽象クラスを継承する具象クラスです。
これらのメソッドを呼び出そうとすると、問題が発生します。
var foo = myService.FindByPredicate(f => f.UserId == 1);
プロパティ「UserId」が抽象「FooBar」タイプに存在するため(したがって、FooとBarにも存在するため)、「あいまいな呼び出し」エラーが発生します。これは理にかなっています。
だから、どうすればこれを克服できますか?
呼び出し元のコードからのインテリセンスの観点から、メソッド名は1つしかないため、インターフェイス(オーバーロードされた述語メソッド)の外観が気に入っています。
なぜ私はそのような私のインターフェースを持っているのですか?「Foo」または「Bar」のみを返したいシナリオもあれば、混合バッグが必要なシナリオもあるので、抽象型を返す必要があります。意味がありますか?
とにかく、明らかな質問に-これを回避する方法はありますか?(インターフェイスメソッドの名前を変更する以外)?(したがって、単純さを損なう)