c# - 也对 Action 使用 func 方法?

标签 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);
        }
    }

现在,大多数方法都是这样调用它的:

    public IEnumerable<PingResponse> GetAllForPingRequest(PingRequest pingRequest)
    {
        return Invoke(() => PingResponseLogic.GetAllForPingRequest(pingRequest));
    }

我的问题是我只有几个方法可以调用它而不需要返回值:

Invoke<void>(() => CustomVariableGroupLogic.Delete(customVariableGroup));

但是,我不能在那里使用 voidInvoke() 方法接受一个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/

相关文章:

c# - 如何连续监听 ASP.NET Core 应用程序中的 Pub/Sub 消息?

c# - 您需要使用 Invoke on Action 吗?

ios - 图像名称作为变量(Swift)

c# - 将具有多个参数的函数作为参数传递

c++ - 错误:参数4从 'const ServerLogInfo'到 'ServerLogInfo&'的未知转换

c# - 如何强制 MSBuild 在不重新编译的情况下运行代码分析

c# - 动态创建的单选按钮不会在单击时执行事件

c# - 带有 ANY 的 Entity Framework 子查询

javascript - <select> onchange 选择不改变

PHP $_POST 函数无法识别 HTML 表单输入值