Я сам работал над аналогичной проблемой, которая включала в себя последовательность делегатов и передачу вывода одного делегата следующему (и так далее ...), так что я подумал, что вас может заинтересоватьсм. код, который я разработал в качестве подтверждения концепции:
static class Program
{
private static IList<Func<int, int>> delegateList =
new List<Func<int, int>>()
{
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<T>(this IEnumerable<Func<T, T>> source,
T startValue)
{
T result = startValue;
foreach (Func<T, T> function in source)
{
result = function(result);
}
return result;
}
}
Последовательность должна содержать делегатов одного типа, поэтому она не такая мощная, как уже принятый ответ, но с несколькими изменениями, оба битакода можно объединить, чтобы обеспечить мощное решение.