包装具有不同参数编号、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);
    }

猜这不是最佳的,所以任何如何改进这一点的建议都会受到高度赞赏。

包装具有不同参数编号、int 返回和输出参数的函数的通用方法

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