2017-10-07 12 views
2

ジェネリックスを学ぼうとしていますが、私は頭がおかしくなりません。ここでC#でマルチパラメータジェネリックメソッドを実装する

は、劇中のインタフェースとクラスです:

public interface IQueryExecutor 
{ 
    T ExecuteQuery<T>(IQuery<T> query); 

    T ExecuteQuery<T, T1>(IQuery<T, T1> query);   
} 

public interface IQuery<out T> 
{ 
    T Execute();   
} 

public class StringQuery : IQuery<string> 
{ 
    public string Execute() 
    { 
     return "String query executed"; 
    } 
} 

public interface IQuery<out T, in T1> 
{ 
    T Execute(T1 input); 
} 

public class ListQuery : IQuery<List<string>, string> 
{ 
    public List<string> Execute(string input) 
    { 
     return new List<string>() { input }; 
    } 
} 

問題は、私はqueryExecutorにおける第二の方法を実装しようとすると発生します。

public class QueryExecutor : IQueryExecutor 
{ 
    public T ExecuteQuery<T>(IQuery<T> query) 
    { 
     return query.Execute(); 
    } 

    public T ExecuteQuery<T, T1>(IQuery<T, T1> query) 
    { 
     return query.Execute(T1 input); 
    }   
} 

を私はパラメータとしてT1を渡したいですメソッドの実装ですが、これは不可能です(AutofacのようなIoCコンテナを使用することで可能ですが、それは私が望むものではありません)。助けて!私が理解していないジェネリック医薬品のいくつかの非常に基本的なものがなければならない。

そこで問題は、どのように私は実装しないされています

public T ExecuteQuery<T, T1>(IQuery<T, T1> query) 
{ 
     return ???? 
} 
+1

ここでこのパラメータをこのように渡しませんか? T ExecuteQuery (IQuery クエリ、T1パラメータ); – MistyK

+0

'query.Execute(T1 input)'には、正確に何が期待されますか? – poke

+0

リンクされた質問は構文についてのものなので、重複しているとは思っていませんか? 私はクエリの実装の例を追加して、クエリで何ができるかを明確にしました。 @MistyK:可能な回避策です。私はそれをテストし、それは動作します。元のコードをそのまま動作させることができない場合、解決策としてあなたの答えを受け入れるでしょう – Hos

答えて

1

をあなたはどこかに入力パラメータを渡す必要があります。最良のオプションは、次のように入力パラメータを受け入れるようにメソッドシグネチャを拡張するために、次のようになります。

public interface IQueryExecutor 
{ 
    T ExecuteQuery<T>(IQuery<T> query); 

    T ExecuteQuery<T, T1>(IQuery<T, T1> query, T1 input);   
} 

2番目のオプションは、コンストラクタであなたのIQUERYインターフェースパス入力パラメータの第二のバージョンを削除することです。

public class ListQuery : IQuery<List<string>> 
{ 
    private string _input; 

    public ListQuery(string input) 
    { 
     _input= input; 
    } 
    public List<string> Execute() 
    { 
     return new List<string>() { _input }; 
    } 
} 
+1

あなたの提案をありがとう!最初の解決策を変更してT1をparamとして使用する場合は、元のコメントと同様に答えとしてマークします。 – Hos

+0

私の間違い、修正済み – MistyK

関連する問題