我创建了一个抽象try/catch功能的方法.我有大约30种方法具有完全相同的try/catch方案.所以我把它放在一个方法中:
private T Invoke<T>(Func<T> func)
{
try
{
return func.Invoke();
}
catch (Exception ex)
{
throw LogAndThrowFaultException(ex);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,大多数方法都称之为:
public IEnumerable<PingResponse> GetAllForPingRequest(PingRequest pingRequest)
{
return Invoke(() => PingResponseLogic.GetAllForPingRequest(pingRequest));
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我只有几个方法调用它而不需要返回一个值:
Invoke<void>(() => CustomVariableGroupLogic.Delete(customVariableGroup));
Run Code Online (Sandbox Code Playgroud)
但是,我不能void在那里使用.该Invoke()方法需要a func,但在这种情况下它需要是一个action.我做了一些研究,看起来我可能需要创建另一种Invoke()方法,但需要采取行动.这些建议来自2009年和2010年.有可能以某种方式使用我的func方法而不必创建另一种Invoke()方法Invoke2()吗?
一个快速而肮脏的解决方案是在调用方法后添加默认值Delete.如果不将Invoke方法的结果赋给变量,它将被忽略.例如,下一个代码演示了这个:
Invoke(() => {CustomVariableGroupLogic.Delete(customVariableGroup); return 0; });
Run Code Online (Sandbox Code Playgroud)
你可以看到这里提出的类似例子,
如果你有很多这样的调用,你可以构建一个花哨的包装器,它将返回Func给定的Action.例:
Func<Action, Func<int>> wrap = action => () => {action(); return 0;};
Run Code Online (Sandbox Code Playgroud)
现在你可以
Invoke(() => wrap(() => CustomVariableGroupLogic.Delete(customVariableGroup)));
Run Code Online (Sandbox Code Playgroud)
但这有点接近lambda疯狂
灵感来自pcm2:
您可以创建一个重载Invoke,只需Action作为参数,使用上面提出的解决方案来调用实现Func<T>:
public void Invoke(Action action)
{
Invoke(() => {action(); return 0;});
}
Run Code Online (Sandbox Code Playgroud)
现在你可以
Invoke(() => CustomVariableGroupLogic.Delete(customVariableGroup));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
563 次 |
| 最近记录: |