2009-12-09 48 views
9

我有兴趣编写一种方法,可以接受另一种方法作为参数,但不希望被锁定到特定的签名 - 因为我不关心这一点。我只关心该方法在调用时是否引发异常。在.NET Framework中是否有构造允许我接受任何委托作为参数?如何接受任何代表作为参数

例如,下面所有的调用应该工作(不使用重载!):

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

你怎么测试,看看如果方法抛出一个异常?如果你打算把它放在'try'-'catch'块中并调用它,你仍然需要提供它的参数。 – 2009-12-09 22:55:30

回答

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

DoesItThrowException(delegate { desomething(); }); 

//or 

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

,除非你给它的参数不能调用它;除非你知道签名,否则你不能给出论据。为了解决这个问题,我想地方的负担主叫 - 我会用Action和匿名的方法/ lambda表达式,即

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

否则,您可以使用DelegateDynamicInvoke,但速度很慢,你需要知道哪些参数给予它。

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

在问题中演示的语法很明显,lambda是唯一可行的选择 - 他并不是真的想要传递一个委托给所有参数绑定的方法。 – 2009-12-09 20:44:28

+0

@Pavel:您将需要一个'更好'的语言,比如像Scheme,允许语法抽象。 – leppie 2009-12-10 12:24:05

+0

为什么“更好”而不仅仅是“更好”?计划真的更好。 – 2014-12-02 12:48:15

相关问题