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