如何通过将 Func 和 Action 作为参数的函数的两个重载来简化代码?
How to simplify the code with two overloads of the function that get Func and Action as a parameter?
有没有办法让这样的代码更简单?是的,我知道注释中的代码可以提取为一个方法,但是每次都写这么两个重载有点混乱。请注意,在 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);
}
更复杂的变体。如果 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>
.
有没有办法让这样的代码更简单?是的,我知道注释中的代码可以提取为一个方法,但是每次都写这么两个重载有点混乱。请注意,在
等函数中可以有除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); }
更复杂的变体。如果
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>
.