2009-12-09 10 views
9

Interesuje mnie pisanie metody, która zaakceptowałaby inną metodę jako parametr, ale nie chcę być przypisana do konkretnego podpisu - ponieważ nie dbam o to. Interesuje mnie tylko to, czy metoda wyrzuca wyjątek po wywołaniu. Czy istnieje .NET Framework, który pozwoli mi zaakceptować dowolnego delegata jako parametr?Jak zaakceptować KAŻDEGO delegata jako parametr

Na przykład, wszystkie z poniższych połączeń powinny działać (bez użycia przeciążeń!):

DoesItThrowException(doSomething(arg)); 
DoesItThrowException(doSomethingElse(arg1, arg2, arg3, arg4, arg5)); 
DoesItThrowException(doNothing()); 
+0

Jak się testuje, czy metoda zgłasza wyjątek? Jeśli planujesz trzymać go w bloku 'try' -'catch' i go wywoływać, nadal będziesz musiał podać mu parametry. –

Odpowiedz

3
bool DoesItThrowException(Action a) 
{ 
    try 
    { 
    a(); 
    return false; 
    } 
    catch 
    { 
    return true; 
    } 
} 

DoesItThrowException(delegate { desomething(); }); 

//or 

DoesItThrowException(() => desomething()); 
10

Nie można powoływać się go chyba dać argumenty; i nie możesz podać argumentów, chyba że znasz podpis. Aby obejść ten problem, chciałbym umieścić ten ciężar na rozmówcy - użyłbym Action i Anon-metod/lambdy, tj

DoesItThrowException(FirstMethod); // no args, "as is" 
DoesItThrowException(() => SecondMethod(arg)); 
DoesItThrowException(() => ThirdMethod(arg1, arg2, arg3, arg4, arg5)); 

W przeciwnym razie, można użyć Delegate i DynamicInvoke, ale jest powolny i trzeba wiedzieć, które argumenty dają.

public static bool DoesItThrowException(Action action) { 
    if (action == null) throw new ArgumentNullException("action"); 
    try { 
     action(); 
     return false; 
    } catch { 
     return true; 
    } 
} 
+0

Ze składnią, jak pokazano w pytaniu, oczywiste jest, że lambda jest jedynym realnym wyborem - tak naprawdę nie chce przekazywać delegata tak bardzo, jak metodą z wszystkimi powiązanymi parametrami. –

+0

@Pavel: Będziesz potrzebować "lepszego" języka, na przykład Schematu, który pozwala na syntaktyczną abstrakcję. – leppie

+0

Dlaczego "lepiej", a nie tylko "lepiej"? Schemat jest naprawdę lepszy. –

Powiązane problemy