C# 通用函数包装器

C# 通用函数包装器,c#,methods,wrapper,C#,Methods,Wrapper,我有很多不同内容的函数,但是里面的参数和try-catch几乎是相似的。是否有任何方法来包装函数,以减少冗余代码 ResponseStatus GetPotatoList(GetPotatosRequest requestParam, out GetPotatosResponse response, out ResponseErrorType errorType) { ResponseStatus status = ResponseStatus.Fail; response =

我有很多不同内容的函数,但是里面的参数和try-catch几乎是相似的。是否有任何方法来包装函数,以减少冗余代码

ResponseStatus GetPotatoList(GetPotatosRequest requestParam, out GetPotatosResponse response, out ResponseErrorType errorType)
{
    ResponseStatus status = ResponseStatus.Fail;
    response = new GetPotatosResponse();

    //To Do

    try
    {

        //To Do

        status = ResponseStatus.Success;
    }
    catch(CustomException ex)
    {
        errorType = ResponseErrorType.CustomError;
    }
    catch(TimeoutException ex)
    {
        errorType = ResponseErrorType.Timeout;
    }
    catch(Exception ex)
    {
        errorType = ResponseErrorType.GeneralFailure;
    }

    return status;
}

您可以将
操作
传递给您的方法

ResponseStatus GetPotatoList(Action action1, Action action2, GetPotatosRequest requestParam, out GetPotatosResponse response, out ResponseErrorType errorType)
{
    ResponseStatus status = ResponseStatus.Fail;
    response = new GetPotatosResponse();

    action1();

    try
    {
        action2();
        status = ResponseStatus.Success;
    }
    catch(CustomException ex)
    {
        errorType = ResponseErrorType.CustomError;
    }
    catch(TimeoutException ex)
    {
        errorType = ResponseErrorType.Timeout;
    }
    catch(Exception ex)
    {
        errorType = ResponseErrorType.GeneralFailure;
    }

    return status;
}
然后使用它:

var response = GetPotatoList(
    () => doSomething(),
    () => doSomethingElse(),
    requestParam,
    out response,
    out errorType);

相反,您应该使用一个函数,该函数将请求作为参数并返回响应对象,然后您可以利用泛型进行调用,然后处理特定情况。另外,为结果返回元组或某种泛型类型可能是一个好主意,而不是使用out参数

public static Tuple<TResponse, ResponseStatus, ResponseErrorType> GetResponse<TRequest, TResponse>(Func<TRequest, TResponse> action, TRequest request)
{
    var status = ResponseStatus.Fail;
    var errorType = ResponseErrorType.None;
    var response = default(TResponse);

    try
    {
        response = action(request);
        status = ResponseStatus.Success;
    }
    catch (CustomException ex)
    {
        errorType = ResponseErrorType.CustomError;
    }
    catch (TimeoutException ex)
    {
        errorType = ResponseErrorType.Timeout;
    }
    catch (Exception ex)
    {
        errorType = ResponseErrorType.GeneralFailure;
    }

    return new Tuple<TResponse, ResponseStatus, ResponseErrorType>(response, status, errorType);
}
公共静态元组GetResponse(Func操作、TRequest请求)
{
var状态=ResponseStatus.Fail;
var errorType=ResponseErrorType.None;
var响应=默认值(响应);
尝试
{
响应=行动(请求);
状态=响应状态。成功;
}
捕获(自定义异常)
{
errorType=ResponseErrorType.CustomError;
}
捕获(TimeoutException例外)
{
errorType=ResponseErrorType.Timeout;
}
捕获(例外情况除外)
{
errorType=ResponseErrorType.GeneralFilure;
}
返回新元组(响应、状态、错误类型);
}

我需要在调用签名变化不大的原始方法之前和之后提供功能

我用了Func

public static Func Hello=name=>“Hello”+name;
公共静态字符串Hello2(字符串名称)=>wrap(Hello)(名称);
//这不会保留IDE中提示的参数名称
public static Func Hello3=name=>wrap(Hello)(name);
私有静态函数换行(函数源)
{
返回name=>orig(name.ToUpper());
} 

是否可以访问action1()和action2()中的值?@Amigo为什么需要它?如果需要传递参数,可以使用键入的操作:
Action
,例如,可以这样设置:
(myInt)=>doSomething(myInt)
,并这样使用:
action1(213);如果您还不了解他们,我邀请您搜索
C#lambdas
,了解其工作原理。
    public static Func<string, string> Hello = name => "hello " + name;

    public static string Hello2(string name) => wrap(Hello)(name);

    // This does NOT retain the name of the arg for hints in the IDE 
    public static Func<string, string> Hello3 = name => wrap(Hello)(name);

    private static Func<string, T> wrap<T>(Func<string, T> orig)
    {
        return name => orig(name.ToUpper());
    }