2012-02-23 5 views
5

、私は書かれています:System.Actionを戻り値の型で使用する方法BLLクラスで

Private List<T> GetData(string a, string b) 
{ 
    TryAction(()=>{ 
     //Call BLL Method to retrieve the list of BO. 
     return BLLInstance.GetAllList(a,b); 
    }); 
} 

をBLL基本クラスでは、私は方法があります:

protected void TryAction(Action action) 
{ 
try 
{ 
    action(); 
} 
catch(Exception e) 
{ 
    // write exception to output (Response.Write(str)) 
} 
} 

どのように私は、一般的な戻り値の型を持つTryAction()メソッドを使用することができますか? ご提案をお願いします。

答えて

7

値を返すメソッドを表すには、Funcを使用する必要があります。

は以下

private List<int> GetData(string a, string b) 
    { 
     return TryAction(() => 
     { 
      //Call BLL Method to retrieve the list of BO. 
      return BLLInstance.GetAllList(a,b); 
     }); 
    } 


    protected TResult TryAction<TResult>(Func<TResult> action) 
    { 
     try 
     { 
      return action(); 
     } 
     catch (Exception e) 
     { 
      throw; 
      // write exception to output (Response.Write(str)) 
     } 
    } 
+0

おかげでたくさん助け例です。 – Pravin

6

Actionは、戻り値の型がvoidの代理人です。したがって、値を返す場合はできません。

そのためにはFuncデリゲートを使用する必要があります(最後の型パラメータは戻り値の型です)。


あなたは、単にTryAction持つジェネリック型を返す、汎用的な方法にそれをしたい場合は:あなたがやろうとしている正確に何によって

protected T TryAction<T>(Action action) 
{ 
try 
{ 
    action(); 
} 
catch(Exception e) 
{ 
    // write exception to output (Response.Write(str)) 
} 

return default(T); 
} 

、あなたがする必要があるかもしれません汎用メソッドとFunc代理人の両方を使用してください。

protected T TryAction<T>(Func<T> action) 
{ 
try 
{ 
    return action(); 
} 
catch(Exception e) 
{ 
    // write exception to output (Response.Write(str)) 
} 

return default(T); 
} 
0

Funcアクションデリゲートの代わりにデリゲート。

関連する問題