using Microsoft.CSharp.RuntimeBinder; using System; using System.Dynamic; using System.Linq.Expressions; namespace ConsoleApplication1 { public class ExpressionTreeUtils { private static Expression> CreateLambdaCastExpression() { // source var sourceParameterExpression = Expression.Parameter(typeof(object), "source"); var binder = Binder.GetMember( CSharpBinderFlags.None, "IntProp", typeof(ExpressionTreeUtils), new[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) }); // CSharpBinderFlags.ConvertExplicit: explicit cast // (will convert double to decimal) // CSharpBinderFlags.None: implicit cast // (will convert int to decimal) var convert = Binder.Convert(CSharpBinderFlags.ConvertExplicit, typeof(decimal), typeof(ExpressionTreeUtils)); // source.sourceProperty var sourcePropertyExpression = Expression.Dynamic( binder, typeof(object), sourceParameterExpression); // (decimal) source; var castedValueExpression = Expression.Dynamic( convert, typeof(decimal), sourcePropertyExpression); // () => (decimal) source; return Expression.Lambda>(castedValueExpression, sourceParameterExpression); } public static void Test() { dynamic source = new ExpandoObject(); source.IntProp = 1.5; decimal r = CreateLambdaCastExpression().Compile()(source); Console.WriteLine(r); } } class Program { static void Main(string[] args) { ExpressionTreeUtils.Test(); } } }