2012-06-18 8 views
5

Mam wiele wywołań metod w bibliotece innej firmy. Metody te mają wiele różnych kombinacji sygnatur i parametrów.Zawijanie wielu wywołań metod (każdy ma inne sygnatury) w jednym module obsługi

Istnieją specyficzne błędy, które generuje biblioteka stron trzecich, które chciałbym przechwycić i obsłużyć, a ponieważ rozdzielczość jest taka sama, chciałbym, aby miało to miejsce w pojedynczym module obsługi.

Tak więc chcę mieć metodę, która zasadniczo przyjmuje jako parametry funkcję (delegata) i jej argumenty, i wywołuje ją wewnątrz pewnej logiki try/catch.

Nie wiem, czy to po prostu niemożliwe, czy też nie otrzymuję prawidłowej składni, ale nie mogę wymyślić, jak sobie poradzić z tym, że podpis dla każdej przekazywanej metody jest inny.

Wszelkie sugestie?

Odpowiedz

7

Można użyć Action i Func<T> do zawijania metod i zamykania w celu przekazania argumentów.

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; }); 
} 

Można wtedy użyć tego poprzez:

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

Edycja: powyżej zakładając, że zostały zawijania instancję biblioteki osób trzecich. Biorąc pod uwagę (od twoich komentarzach), że są to metody statyczne, można po prostu użyć:

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; }); 
} 

a następnie wywołać poprzez:

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

podziękowania. Skąd pochodzi WrappedObject - czy jest to instancja klasy trzeciej? Mam trochę komplikacji w tym, że klasa 3rd party jest klasą statyczną, ale przypuszczam, że mogę utworzyć klasę niestatyczną, aby ją wyprzedzić i odsłonić metody w ten sposób. – bkr

+0

@bkr Zakładano, że twoim "opakowaniem" było zawijanie instancji obiektu. Bez tego jest to naprawdę łatwiejsze - będę edytować i wyświetlać –

+0

@bkr Edytowane, aby wyświetlić zamiast tego korzystanie ze statystyk. –

Powiązane problemy