在单个处理程序中包装多个方法调用(每个方法具有不同的签名)

时间:2012-06-18 17:21:25

标签: c#

我在第三方库中有多个方法调用。 这些方法具有各种不同的签名/参数组合。

第三方库生成了我想要捕获和处理的特定错误,并且由于分辨率相同,我希望它在单个处理程序中发生。

所以我希望能够有一个方法,它实质上接受一个函数(委托)及其参数作为参数,并在一些try / catch逻辑中调用它。

我不知道它是不可能还是我没有正确的语法,但我无法弄清楚如何处理传入的每个方法的签名不同的事实。

有什么建议吗?

1 个答案:

答案 0 :(得分:7)

您可以使用ActionFunc<T>来包装方法,并使用闭包来传递参数。

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

然后你可以通过以下方式使用它:

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

编辑:上面假设您正在包装第三方库的实例。鉴于(根据您的评论)这些是静态方法,您可以使用:

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

然后通过以下方式致电:

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