2012-06-18 10 views
5

Tengo varias llamadas a métodos en una biblioteca de terceros. Estos métodos tienen una amplia variedad de combinaciones de firmas/parámetros diferentes.Enlazar llamadas de método múltiple (que cada una tiene firmas diferentes) en un solo controlador

Existen errores específicos que la biblioteca de terceros genera que me gustaría detectar y manejar, y dado que la resolución es la misma, me gustaría que tuviera lugar en un único controlador.

Así que quiero ser capaz de tener un método que esencialmente toma como parámetros una función (delegar) y sus argumentos, y lo invoca dentro de alguna lógica try/catch.

No sé si no es posible o no estoy obteniendo la sintaxis correcta, pero no puedo entender cómo manejar el hecho de que la firma de cada método que se transfiere es diferente.

¿Alguna sugerencia?

Respuesta

7

Puede usar Action y Func<T> para ajustar los métodos y cierres para pasar los argumentos.

public TResult CallMethod<TResult>(Func<ThirdPartyClass, TResult> func) 
{ 
    try 
    { 
     return func(this.wrappedObject); 
    } 
    catch(ThirdPartyException e) 
    { 
     // Handle 
    } 
} 

public void CallMethod(Action<ThirdPartyClass> method) 
{ 
    this.CallMethod(() => { method(this.WrappedObject); return 0; }); 
} 

A continuación, puede utilizar esta vía:

var result = wrapper.CallMethod(thirdParty => thirdParty.Foo(bar, baz)); 

Editar: Lo anterior fue asumiendo que envolvían una instancia de la biblioteca de terceros. Teniendo en cuenta (a partir de sus comentarios) que estos son métodos estáticos, sólo puede utilizar:

public static TResult CallMethod<TResult>(Func<TResult> func) 
{ 
    try 
    { 
     return func(); 
    } 
    catch(ThirdPartyException e) 
    { 
     // Handle 
    } 
} 

public static void CallMethod(Action method) 
{ 
    CallMethod(() => { method(); return 0; }); 
} 

y luego llamar a través de:

var result = Wrapper.CallMethod(() => ThirdParty.Foo(bar, baz)); 
+0

gracias. ¿De dónde viene WrappedObject? ¿Es esta una instancia de la clase de terceros? Tengo un poco de complicación ya que la clase de terceros es una clase estática, pero supongo que puedo crear una clase no estática para enfrentarlo y exponer los métodos de esa manera. – bkr

+0

@bkr Esto suponía que su "envoltura" envolvía una instancia del objeto. Sin eso, en realidad es más fácil: editaré y mostraré –

+0

@bkr Editado para mostrar el uso de estadísticas. –

Cuestiones relacionadas