我创建了一个抽象 try/catch 功能的方法。我有大约 30 种方法具有完全相同的 try/catch 场景。所以我把它放在一个方法中:
private T Invoke<T>(Func<T> func)
{
try
{
return func.Invoke();
}
catch (Exception ex)
{
throw LogAndThrowFaultException(ex);
}
}
现在,大多数方法都是这样调用它的:
public IEnumerable<PingResponse> GetAllForPingRequest(PingRequest pingRequest)
{
return Invoke(() => PingResponseLogic.GetAllForPingRequest(pingRequest));
}
我的问题是我只有几个方法可以调用它而不需要返回值:
Invoke<void>(() => CustomVariableGroupLogic.Delete(customVariableGroup));
但是,我不能在那里使用 void
。 Invoke()
方法接受一个func
,但在本例中它需要是一个action
。我做了一些研究,看起来我可能必须创建另一个 Invoke()
方法,但让它采取行动。这些建议来自 2009 年和 2010 年。是否可以以某种方式使用我的 func 方法,而不必创建另一个 Invoke()
方法,如 Invoke2()
?
最佳答案
一个快速但肮脏的解决方案是在调用 Delete
之后添加默认 值方法。如果您不分配 Invoke
的结果,它无论如何都会被忽略变量的方法。例如,下一个代码演示了这一点:
Invoke(() => {CustomVariableGroupLogic.Delete(customVariableGroup); return 0; });
你可以看到类似的例子被提出here ,
如果你有很多很多这样的调用,你可以构建一个花哨的包装器,它将返回 Func
对于给定的 Action
.示例:
Func<Action, Func<int>> wrap = action => () => {action(); return 0;};
现在你可以
Invoke(() => wrap(() => CustomVariableGroupLogic.Delete(customVariableGroup)));
但这有点接近 lambda 的疯狂
受 pcm2 启发:
您可以创建重载到 Invoke
, 这只需要 Action
作为参数,使用上面提出的解决方案通过 Func<T>
调用实现:
public void Invoke(Action action)
{
Invoke(() => {action(); return 0;});
}
现在你可以
Invoke(() => CustomVariableGroupLogic.Delete(customVariableGroup));
关于c# - 也对 Action 使用 func 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16926307/