你可以将一个委托的结果链接到C#中另一个委托的输入吗?

我正在寻找一种链接几个代表的方法,所以一个代表的结果成为下一个代表的输入。 我试图在方程求解程序中使用它,其中部分通过不同的方法完成。 这个想法是,当你构建方程式时,程序会添加代理并按特定顺序链接它们,因此可以正确解决。 如果有更好的方法来解决问题,请分享。

这可能有所帮助:

public static Func Compose(Func innerFunc, Func outerFunc) { return arg => outerFunc(innerFunc(arg)); } 

这将执行函数组合 ,运行innerFunc并在提供初始参数时将结果传递给outerFunc

 Func floor = Math.Floor; Func convertToInt = Convert.ToInt32; Func floorAndConvertToInt = Compose(floor, convertToInt); int result = floorAndConvertToInt(5.62); Func floorThenConvertThenAddTen = Compose(floorAndConvertToInt, i => i + 10); int result2 = floorThenConvertThenAddTen(64.142); 

是的,这是可能的 – 您需要确保委托的返回类型是被调用的委托的参数类型。

虽然你可能想看一下表达式 ,但很多LINQ都是以这种方式构建的。

您描述的API类型称为Fluent API 。 查看前面的文章以获得一个好的教程。

关于委托链接,请查看.NET 3.5中的LINQ扩展方法,特别是lambda函数(委托)如何传递给IEnumerable结果中的函数结果,然后可以使用另一个扩展方法+ lambda进行链接。

在您的特定情况下,您可能需要创建一个名为Functor的类来接受委托并返回另一个也可由委托操作的Functor。

最好的祝福,

使用GetInvocationlist可以实现这一点。

  Delegate[] chain = chained.GetInvocationList(); int res = 10; for( int i = 0; i < chain.Length; i++ ) { //Call chain[i] res = chain[i](res); } 

我自己一直在研究类似的问题,包括调用一系列委托并将一个委托的输出传递给下一个委托(依此类推……)所以你可能有兴趣看到我开发的代码作为证据 -概念:

 static class Program { private static IList> delegateList = new List>() { AddOne, AddOne, AddOne, AddOne, AddOne, AddOne, AddOne, AddOne, AddOne, AddOne, }; static void Main(string[] args) { int number = 12; Console.WriteLine("Starting number: {0}", number); Console.WriteLine("Ending number: {0}", delegateList.InvokeChainDelegates(number)); Console.ReadLine(); } public static int AddOne(int num) { return num + 1; } public static T InvokeChainDelegates(this IEnumerable> source, T startValue) { T result = startValue; foreach (Func function in source) { result = function(result); } return result; } } 

序列必须包含相同类型的委托,因此不如已经接受的答案那么强大,但是通过一些调整,两个代码位可以组合起来以提供强大的解决方案。