如何将任何方法作为参数传递以确定它是否抛出异常

时间:2015-01-20 00:53:19

标签: c#

我正在尝试编写一个方法,我可以传入任何方法调用并确定它是否不会引发异常。

/// <summary>
/// No exceptions thrown
/// </summary>
/// <returns></returns>
public bool NoThrows(Action method)
{
    try
    {
        method();
        return true;
    }
    catch (Exception exception)
    {
        throw new AssertException(string.Format("Boom: {0}", exception));
    }
}

当我传入一个返回void的方法时,例如.Click()

foo.NoThrows(officeDropDown.Click());

我得到Argument type 'void' is not assignable to System.Action ...是否可以将任何方法调用作为对象传递并确定它是否会抛出任何异常?

2 个答案:

答案 0 :(得分:2)

你应该传递方法,而不是方法结果:

foo.NoThrows(officeDropDown.Click);

或者您可以传递lambda表达式:

foo.NoThrows(() => officeDropDown.Click());

答案 1 :(得分:2)

您需要创建一个Action的实例来传递给该方法,就像使用任何其他参数一样。

C#将隐式地将lambda或方法组转换为Action:

foo.NoThrows(() => officeDropDown.Click()); // Lambda
foo.NoThrows(officeDropDown.Click); // Method group