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

时间:2016-03-09 17:36:21

标签: c# generics action functor func

  1. 这是使这种代码更简单的一种方法吗?是的,我知道注释中的代码可以作为一种方法提取,但每次编写这样的两个重载都有点令人困惑。请注意,functor等函数中可能还有DoSomething以外的其他参数。

    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调用,如何在没有代码重复的情况下获得相同的结果?

  3. 实际上我想找到C#14代码的C#替代品,如

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

1 个答案:

答案 0 :(得分:1)

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

FuncWrapper可以有两个成员(一个Func&lt; ...&gt;和Action&lt; ...&gt;)并调用一个不为null的成员,或者你可以包含Action&lt; ... &GT;使用lambda表达式,基本上将其转换为Func&lt; ...&gt; (调用操作,返回默认值(Result))

然后在类中定义一个函数:

Result DoSomething(FuncWrapper<Parameter, Result> wrapper)
{
    // Find argument
    return wrapper.Call(argument);
}

如果FuncWrapper,您的default(Result)课程应返回Action<Parameter>值。