包装具有不同参数编号、int 返回和输出参数的函数的通用方法
本文关键字:参数 输出 函数 方法 返回 int 编号 包装 | 更新日期: 2023-09-27 17:55:24
我有一个服务(第三方),有很多带有签名的方法,例如:
int MethodA(int, string, out T result)
int MethodB(int, string, string, out T[] result)
int MethodC(DateTime, string, string, out T result)
其中返回int
只是一个响应代码,我实际上需要 T。
每次调用后,我都有一个错误日志记录逻辑(基本上是调用错误处理方法,响应代码作为参数)。
我想要这样的东西:
private T GenericDataExtractor<T>(Func function) {
T result;
int responseCode = function(out result);
if(responseCode != 0)
/* handling here */
return result;
}
但是没有办法将输出参数作为参数传递给 func。
更新
正如我在服务示例中提到的,传递带有泛型参数的委托对我来说很重要。换句话说,我想要一个方法,它接受具有不同参数数量的函数,但具有固定的返回类型和泛型 out 参数。
最后
好吧,我最终得到了这个解决方案:
protected delegate int KeeperAPIDelegate<TReturn>(string sessionID, out TReturn rObj);
protected delegate int KeeperAPIDelegate<T1, TReturn>(string sessionID, T1 obj1, out TReturn rObj);
protected delegate int KeeperAPIDelegate<T1, T2, TReturn>(string sessionID, T1 obj1, T2 obj2, out TReturn rObj);
protected delegate int KeeperAPIDelegate<T1, T2, T3, TReturn>(string sessionID, T1 obj1, T2 obj2, T3 obj3, out TReturn rObj);
protected TReturn DataGrabber<TReturn>(KeeperAPIDelegate<TReturn> action)
{
TReturn data;
int result = action.Invoke(SessionID, out data);
if (result == 0) return data;
throw HandleError(result);
}
protected TReturn DataGrabber<T1, TReturn>(KeeperAPIDelegate<T1, TReturn> action, params object[] args)
{
TReturn data;
int result = action.Invoke(SessionID, (T1)args[0], out data);
if (result == 0) return data;
throw HandleError(result);
}
protected TReturn DataGrabber<T1, T2, TReturn>(KeeperAPIDelegate<T1, T2, TReturn> action, params object[] args)
{
TReturn data;
int result = action.Invoke(SessionID, (T1)args[0], (T2)args[1], out data);
if (result == 0) return data;
throw HandleError(result);
}
protected TReturn DataGrabber<T1, T2, T3, TReturn>(KeeperAPIDelegate<T1, T2, T3, TReturn> action, params object[] args)
{
TReturn data;
int result = action.Invoke(SessionID, (T1)args[0], (T2)args[1], (T3)args[2], out data);
if (result == 0) return data;
throw HandleError(result);
}
猜猜这不是最佳的,所以任何如何改进这一点的建议都会受到高度赞赏。
Func 不是不支持out
参数,但自定义委托没有问题
public delegate int MyFunction<T>(out T parameter);
private T GenericDataExtractor<T>(MyFunction<T> function, out T result){
T result;
int responseCode = function(out result);
if(responseCode != null) /* handling here */
//the if above is always true :)
return result;
}