我对第 3 方库中的方法进行了多次调用。这些方法具有多种不同的签名/参数组合。
第 3 方库生成的某些特定错误是我想要捕获和处理的,并且由于解决方案相同,我希望它发生在单个处理程序中。
所以我希望能够有一个方法,它基本上将函数(委托)及其参数作为参数接收,并在一些 try/catch 逻辑中调用它。
我不知道这是不可能的,还是我的语法不正确,但我不知道如何处理传入的每个方法的签名不同的事实。
有什么建议么?
我对第 3 方库中的方法进行了多次调用。这些方法具有多种不同的签名/参数组合。
第 3 方库生成的某些特定错误是我想要捕获和处理的,并且由于解决方案相同,我希望它发生在单个处理程序中。
所以我希望能够有一个方法,它基本上将函数(委托)及其参数作为参数接收,并在一些 try/catch 逻辑中调用它。
我不知道这是不可能的,还是我的语法不正确,但我不知道如何处理传入的每个方法的签名不同的事实。
有什么建议么?
您可以使用Action
andFunc<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));