这是使这种代码更简单的一种方法吗?是的,我知道注释中的代码可以作为一种方法提取,但每次编写这样的两个重载都有点令人困惑。请注意,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);
}
更复杂的变体。如果functor
块中有using
调用,如何在没有代码重复的情况下获得相同的结果?
实际上我想找到C#14代码的C#替代品,如
template <class Functor>
auto DoSomething(Functor functor)
{
// do something...
return functor(argument);
}
答案 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>
值。