using System.Linq.Expressions;
MathOp op1 = delegate(int x, int y) { return x + y; };
Console.WriteLine($"10 + 20 = {op1(10, 20)}");
Console.WriteLine($"10 + 20 = {op1(10, 20)}");
Func<int, int, int> f1 = (x, y) => x + y;
Console.WriteLine($"10 + 20 = {f1(10, 20)}");
var f2 = (int x, int y) => x + y;
Console.WriteLine($"10 + 20 = {f2(10, 20)}");
static int Add(int x, int y) => x + y;
Console.WriteLine($"10 + 20 = {f2(10, 20)}");
Console.WriteLine($"10 + 20 = {d1.DynamicInvoke(10, 20)}");
foreach(var p in mi.GetParameters())
Console.WriteLine($"{p.ParameterType} {p.Name}");
static Func<string> ConvertToStringReturner(Delegate d)
var randomParams = mi.GetParameters().Select(p => Expression.Constant(Random.Shared.Next(100), typeof(int))).ToArray();
var addExpr = Expression.Call(null,
var toStringExpr = Expression.Call(addExpr,
typeof(object).GetMethod("ToString"));
var expression = Expression.Lambda<Func<string>>(toStringExpr, Array.Empty<ParameterExpression>());
var f3 = expression.Compile();
var f3 = ConvertToStringReturner(static (int x, int y) => x + y);
Console.WriteLine($"The result of adding two random numbers is {f3()}");
delegate int MathOp(int x, int y);