using System;
using System.Linq;
using System.Linq.Expressions;
public class Test
{
private static Expression<Func<T,TResult>> Unbox<T,TResult>(Expression<Func<T,object>> original) {
return Expression.Lambda<Func<T,TResult>>(
Expression.Convert(original.Body, typeof(TResult))
, original.Parameters
);
}
public static void Main() {
Expression<Func<int,object>> f1 = i => i*i;
Expression<Func<int,int>> f2 = Unbox<int,int>(f1);
Func<int,int> f = f2.Compile();
Console.WriteLine("Result 2 times 2 is {0}", f(2));
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLkxpbnEuRXhwcmVzc2lvbnM7CgpwdWJsaWMgY2xhc3MgVGVzdAp7Cglwcml2YXRlIHN0YXRpYyBFeHByZXNzaW9uPEZ1bmM8VCxUUmVzdWx0Pj4gVW5ib3g8VCxUUmVzdWx0PihFeHByZXNzaW9uPEZ1bmM8VCxvYmplY3Q+PiBvcmlnaW5hbCkgewoJCXJldHVybiBFeHByZXNzaW9uLkxhbWJkYTxGdW5jPFQsVFJlc3VsdD4+KAogICAgICAgICAgICBFeHByZXNzaW9uLkNvbnZlcnQob3JpZ2luYWwuQm9keSwgdHlwZW9mKFRSZXN1bHQpKQogICAgICAgICwgICBvcmlnaW5hbC5QYXJhbWV0ZXJzCiAgICAgICAgKTsKCX0KCQoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKSB7CgkJRXhwcmVzc2lvbjxGdW5jPGludCxvYmplY3Q+PiBmMSA9IGkgPT4gaSppOwoJCUV4cHJlc3Npb248RnVuYzxpbnQsaW50Pj4gZjIgPSBVbmJveDxpbnQsaW50PihmMSk7CgkJRnVuYzxpbnQsaW50PiBmID0gZjIuQ29tcGlsZSgpOwoJCUNvbnNvbGUuV3JpdGVMaW5lKCJSZXN1bHQgMiB0aW1lcyAyIGlzIHswfSIsIGYoMikpOwoJfQp9