Pet*_*r17 7 .net c# generics delegates functional-programming
我想实现一个方法,它接受两个Action A1和Action A2委托并返回组合它们的新委托.他方法的签名如下:
public static Action<Tuple<T1,T2>> CombineWith<T1,T2>(this Action<T1> a1, Action<T2> a2)
Run Code Online (Sandbox Code Playgroud)
所以,而不是说
{
A1(t1);
A2(t2);
}
Run Code Online (Sandbox Code Playgroud)
我希望能够写:
{
A1.CombineWith(A2)(Tuple.Create(t1,t2));
}
Run Code Online (Sandbox Code Playgroud)
这种方法可能实现的可能是什么?
Ani*_*Ani 15
我想你想要:
public static Action<Tuple<T1,T2>> CombineWith<T1,T2>
(this Action<T1> action1, Action<T2> action2)
{
//null-checks here.
return tuple => {
action1(tuple.Item1);
action2(tuple.Item2);
};
}
Run Code Online (Sandbox Code Playgroud)
用法:
Action<int> a1 = x => Console.Write(x + 1);
Action<string> a2 = x => Console.Write(" " + x + " a week");
var combined = a1.CombineWith(a2);
// output: 8 days a week
combined(Tuple.Create(7, "days"));
Run Code Online (Sandbox Code Playgroud)
编辑:顺便说一句,我注意到你在评论中提到"单独采取论据会更加可取".在这种情况下,你可以这样做:
public static Action<T1, T2> CombineWith<T1, T2>
(this Action<T1> action1, Action<T2> action2)
{
//null-checks here.
return (x, y) => { action1(x); action2(y); };
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1879 次 |
| 最近记录: |