如何通过将 Func 和 Action 作为参数的函数的两个重载来简化代码?

How to simplify the code with two overloads of the function that get Func and Action as a parameter?

  1. 有没有办法让这样的代码更简单?是的,我知道注释中的代码可以提取为一个方法,但是每次都写这么两个重载有点混乱。请注意,在 DoSomething.

    等函数中可以有除 functor 以外的其他参数
    Result DoSomething<Result>(Func<Parameter, Result> functor)
    {
        // do something to construct argument
        return functor(argument);
    }
    
    void DoSomething(Action<Parameter> functor)
    {
        // do something to construct argument
        functor(argument);
    }
    
  2. 更复杂的变体。如果 functor 调用在 using 块内,如何在不重复代码的情况下获得相同的结果?

事实上,我想找到 C# 替代 C++14 代码的方法,例如

template <class Functor>
auto DoSomething(Functor functor)
{
    // do something...
    return functor(argument);
}

好吧,您可以创建一个 FuncWrapper<Parameter, Result> 泛型 class,其中包含 Func<Parameter, Result>Action<Parameter> 的隐式转换以及执行实际调用的 Call(Parameter) 函数.

FuncWrapper 可以有两个成员(Func<...> 和 Action<...>)并通过非空成员调用,或者您可以将 Action<...> 包装为一个 lambda 表达式,本质上将其转换为 Func<...> (调用操作,return default(Result))

然后你在 class:

中只定义一个函数
Result DoSomething(FuncWrapper<Parameter, Result> wrapper)
{
    // Find argument
    return wrapper.Call(argument);
}

您的 FuncWrapper class 应该 return default(Result) 值,以防 Action<Parameter>.