2016-06-16 2 views
0

これは難しいかもしれません。 私はほぼ同じシグネチャを持つ7つの関数を持っていますが、それぞれが同じようなシグネチャを持つ7つの他の関数を呼び出します。私は何をしたいことは何とかそれらを組み合わせてある匿名型関数の組み合わせ

private async Task<IList<T>> QueryAsync<T>(string storedProcedureName, OracleDynamicParameters parameters = null) 
{ 

    // Get our models 
    var models = await this._connection.QueryAsync<T>(storedProcedureName, parameters, commandType: CommandType.StoredProcedure); 

    // Return our list 
    return models.ToList(); 
} 

private async Task<IList<T>> QueryAsync<T, TSecond>(string storedProcedureName, Func<T, TSecond, T> map, string splitOn, OracleDynamicParameters parameters = null) 
{ 

    // Get our models 
    var models = await this._connection.QueryAsync<T, TSecond, T>(storedProcedureName, map, parameters, commandType: CommandType.StoredProcedure, splitOn: splitOn); 

    // Return our list 
    return models.ToList(); 
} 

private async Task<IList<T>> QueryAsync<T, TSecond, TThird>(string storedProcedureName, Func<TFirst, TSecond, TThird, TFirst> map, string splitOn, OracleDynamicParameters parameters = null) 
{ 

    // Get our models 
    var models = await this._connection.QueryAsync<T, TSecond, TThird, T>(storedProcedureName, map, parameters, commandType: CommandType.StoredProcedure, splitOn: splitOn); 

    // Return our list 
    return models.ToList(); 
} 

:私はので、私は唯一ここ2 は私の機能の3つの単純化バージョンである必要があり、それらを組み合わせるしたいと思います。どのように多くの型が渡され、正しいシグネチャが呼び出されたかを調べるためにチェックします。 任意の助けいただければ幸いです:D

+2

これらをジェネリックと組み合わせるには良いソリューションがありません。アクション<...>とFunc <...>を見てください。 Theres 16+の亜種。 –

+0

コード生成(T4と考える)FTW。 –

+0

Reflectionを使っていくつかのvodooを行うことはできますが、...あなた自身の責任で行ってください。 –

答えて

0

何について:これは、それらの上のparamsとヌルロジック(NULL可能)にいくつかのロジックを意味

private async Task<IList<T>> QueryAsync<T, TSecond>(string storedProcedureName, Func<T, TSecond, T> map, string splitOn, OracleDynamicParameters parameters = null, ... other 3 params) 
{ 

    //big switch here based on what are null or not 
    var models = await this._connection.QueryAsync<...>(...); 

    // Return our list 
    return models.ToList(); 
} 

:最後のものがnullの場合は基本的に、それらを残しますでる。

この方法では、1つの大きな機能(最も一般的な機能)のみを使用できます。