还使用func方法进行操作?

Bob*_*orn 5 c# action func

我创建了一个抽象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()吗?

Ily*_*nov 6

一个快速而肮脏的解决方案是在调用方法后添加默认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)