2012-02-23 33 views
5

En la clase BLL, he escrito:Cómo utilizar System.Action con return type?

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

en la clase base BLL, tengo un método:

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

¿Cómo puedo usar TryAction() método con el tipo de retorno genérico? tenga una sugerencia.

Respuesta

7

Debe usar Func para representar un método que devolverá un valor.

A continuación se muestra un ejemplo

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

Gracias ayudaron mucho. – Pravin

6

Action es un delegado que tiene un tipo de devolución void, por lo que si desea que devuelva un valor, no puede.

Para eso, necesita utilizar un delegado Func (hay muchos - el último parámetro de tipo es el tipo de devolución).


Si simplemente desea tener TryAction cambio un tipo genérico, lo convierten en un método genérico:

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

return default(T); 
} 

Dependiendo de qué es exactamente lo que está tratando de hacer, es posible que necesite utilizar tanto un método genérico y Func delegado:

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

return default(T); 
} 
0

usted debe considerar utilizar Func delegado en lugar de delegado de Acción.