using System;
using System.Linq.Expressions;
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Add(10, 20));
Console.WriteLine(Add(10L, 20L));
Console.WriteLine(Add(10.0, 20.0));
Console.ReadKey();
}
static T Add<T>(T a, T b) where T : struct
{
var p1 = Expression.Parameter(typeof(T), "a");
var p2 = Expression.Parameter(typeof(T), "b");
var body = Expression.Add(p1, p2);
var lambda = Expression.Lambda(body, new[] { p1, p2 });
var compiled = (Func<T, T, T>)lambda.Compile();
return compiled(a, b);
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucS5FeHByZXNzaW9uczsKCmNsYXNzIFByb2dyYW0KewogICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQogICAgewogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKEFkZCgxMCwgMjApKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZShBZGQoMTBMLCAyMEwpKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZShBZGQoMTAuMCwgMjAuMCkpOwogICAgICAgIENvbnNvbGUuUmVhZEtleSgpOwogICAgfQoKICAgIHN0YXRpYyBUIEFkZDxUPihUIGEsIFQgYikgd2hlcmUgVCA6IHN0cnVjdAogICAgewogICAgICAgIHZhciBwMSA9IEV4cHJlc3Npb24uUGFyYW1ldGVyKHR5cGVvZihUKSwgImEiKTsKICAgICAgICB2YXIgcDIgPSBFeHByZXNzaW9uLlBhcmFtZXRlcih0eXBlb2YoVCksICJiIik7CiAgICAgICAgdmFyIGJvZHkgPSBFeHByZXNzaW9uLkFkZChwMSwgcDIpOwogICAgICAgIHZhciBsYW1iZGEgPSBFeHByZXNzaW9uLkxhbWJkYShib2R5LCBuZXdbXSB7IHAxLCBwMiB9KTsKICAgICAgICB2YXIgY29tcGlsZWQgPSAoRnVuYzxULCBULCBUPilsYW1iZGEuQ29tcGlsZSgpOwogICAgICAgIHJldHVybiBjb21waWxlZChhLCBiKTsKICAgIH0KfQ==