public static class Expression2Object<TIn, TOut> { private static readonly Func<TIn, TOut> cache = GetFunc(); private static Func<TIn, TOut> GetFunc() { ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn), "obj"); List<MemberBinding> memberBindingList = new List<MemberBinding>(); foreach (var item in typeof(TOut).GetProperties()) { if (!item.CanWrite) { continue; } MemberExpression property = Expression.Property(parameterExpression, typeof(TIn).GetProperty(item.Name)); MemberBinding memberBinding = Expression.Bind(item, property); memberBindingList.Add(memberBinding); } MemberInitExpression memberinitExpression = Expression.MemberInit(Expression.New(typeof(TOut)), memberBindingList.ToArray()); var expression = Expression.Lambda<Func<TIn, TOut>>(memberinitExpression, new ParameterExpression[] { parameterExpression }); return expression.Compile(); } public static TOut Convert(TIn tin) { return cache(tin); } }