2009-12-09 18 views
9

Başka bir yöntemi parametre olarak kabul eden ancak belirli bir imzaya kilitlenmek istemeyen bir yöntem yazmak istiyorum - çünkü umurumda değil. Sadece yöntemin çağrıldığında bir istisna oluşturup vurmadığıyla ilgileniyorum. .NET Framework'de herhangi bir delege parametresi olarak kabul etmeme izin verecek bir yapı var mı?Parametre olarak HERHANGİ bir temsilci kabul etme

Örneğin, aşağıdaki çağrıların hepsi (aşırı yükleri kullanmadan!) Çalışması gerekir:

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

nasıl yöntem bir istisna atar olmadığını görmek için test ediyoruz? Bunu bir "try" -satch 'bloğuna yapıştırmayı ve onu çağırmayı planlıyorsanız, yine de parametreleri sağlamanız gerekecektir. –

cevap

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

DoesItThrowException(delegate { desomething(); }); 

//or 

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

bunu argüman vermek sürece bu çağırmak olamaz; ve imzayı bilmedikçe argümanlar veremezsiniz. Eğer Delegate ve DynamicInvoke kullanabilirsiniz, ben Aksi Action ve anon-yöntemleri/lambdas, yani

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

kullanmak istiyorsunuz, ama bu yavaş ve yapmanız gerekir - Bundan kaçınmak için, ben arayana o yük oluşturacağı bunu vermek için hangisinin gerektiğini bilmek.

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

Soruda gösterildiği gibi sözdizimi ile, lambda'nın tek geçerli seçim olduğu açıktır - gerçekten tüm parametrelere bağlı bir yöntem olarak bir delegeyi çok fazla iletmek istemez. –

+0

@Pavel: Örneğin Şema gibi sözdizimsel soyutlamaya izin veren 'daha iyi' bir dile ihtiyacınız olacaktır. – leppie

+0

Neden "daha iyi" ve sadece "daha iyi" değil? Şema gerçekten daha iyi. –

İlgili konular