2017-12-11 10 views
-1

私は、私がやろうとしていることの名前が分からないことを確信しています。そうしないと、私のグーグルグーグルがより成功するでしょう。私は現在、同じ名前のメソッドを持つインターフェースに関する結果しか見つけません。インターフェイスとクラスメソッドのパラメータのあいまいさ

共通の基本クラスを継承し、インタフェースを実装するクラスがいくつかあります。私は基本クラスまたはインターフェイスをパラメータとして受け入れるメソッドを持っています。 ConcreteExecutionClassにおける呼び出しにDoThings(のIQueryable < A>)とDoThings(のIQueryable < B>) `:このコールは、次のメソッドまたはプロパティとの間に曖昧なエラーで

をあいまいさの原因となるので、私はコンパイルすることができません。

さらに、ジェネリック型の型制約が一意のメソッドシグネチャを作成しないため、ジェネリックは機能しません。

パラメータタイプに基づいて特定のメソッドに強制的に実行させる方法(または許容されるパターン)がありますか?

public abstract class A { 
    // some properties 
} 

public class ConcreteA : A { 
    // full implementation 
} 

public interface B { 
    // a property 
} 

public class ConcreteAB : A, B { 
    // full implementation 
} 

public abstract class ExecutionClass { 
    public IQueryable<A> DoThings(IQueryable<A> content){ 
     return A.method().AsQueryable(); 
    } 

    public IQueryable<B> DoThings(IQueryable<B> content){ 
     return B.interfaceRequiredMethod().method().AsQueryable(); 
    } 
} 

public class ConcreteExecutionClass : ExecutionClass { 
    public void Program(){ 
     var objectList = new List<ConcreteAB>{/*....*/}; 
     DoThings(objectList); 
    } 
} 

具象クラスの各

は、各 DoThings()を呼び出すオブジェクトのリスト、上のクラスの管理LINQクエリを持っています。目的は具体的なクラスに対して透明な DoThings()の実装を維持することです。

私はインターフェイスで共分散を試みましたが、Aを継承して最初のコードパスを強制的に停止させることはできませんでした。

上記のコードは、実際の実装を単純化したものです。 Aと4から派生する約10クラスは、ABに由来します。

+1

'ConcreteAB'にはどのメソッドが呼び出されますか?なぜ? – Rob

+1

https://stackoverflow.com/questions/42078610/c-sharp-generic-method-resolution-fails-with-an-ambiguous-call-error/42078735#42078735 – Ryu

+0

@Ryuを参照してくださいジェネリックが動かないと言った – kskid19

答えて

0

抽象的なAをベースとし、そこから継承する2つの抽象クラスが存在する抽象的な階層を作成しました。

関連する問題