using System.Collections.Generic;
static TResult Foo<TResult>(Delegate f, params object[] args)
object result = f.DynamicInvoke(args);
return (TResult)Convert.ChangeType(result, typeof(TResult));
public static void Main()
Func<string, int, bool, bool> f1 = (name, age, active) =>
if (name == "Jon" && age == 40 && active)
Func<int, int, int, int> f2 = (num1, num2, num3) =>
return num1 + num2 + num3;
Console.WriteLine(Foo<bool>(f1,"Jon", 40, true));
Console.WriteLine(Foo<int>(f2, 1, 2, 3));
Console.WriteLine(Foo<string>(f3));