Как использовать System.Action с типом возврата? - PullRequest
5 голосов
/ 23 февраля 2012

В классе 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() метод с универсальным типом возвращаемого значения? пожалуйста, есть предложение.

Ответы [ 3 ]

7 голосов
/ 23 февраля 2012

Вам необходимо использовать 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))
        }
    }
6 голосов
/ 23 февраля 2012

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 голосов
/ 23 февраля 2012

Вам следует рассмотреть возможность использования Func делегата вместо делегата Action.

...