This "answer" is an elaboration for Jon's answer. (Marking CW)
For the record, DynamicInvoke is a bit slow. To illustrate this, consider the following program:
void Main()
{
Func myFunc = i => i.ToString();
myFunc.DynamicInvoke(1); // Invoke once so initial run costs are not considered
myFunc(1);
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 1000000; i++)
myFunc.DynamicInvoke(1);
stopwatch.Stop();
var elapsed = stopwatch.Elapsed;
stopwatch.Restart();
for (int i = 0; i < 1000000; i++)
myFunc(1);
stopwatch.Stop();
var elapsed2 = stopwatch.Elapsed;
Console.WriteLine("DynamicInvoke: " + elapsed);
Console.WriteLine("Direct Invocation: " + elapsed2);
}
Prints out:
DynamicInvoke: 00:00:03.1959900
Direct Invocation: 00:00:00.0735220
Which means that DynamicInvoke (in this simple case) is 42 times slower than direct invocation.