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);
    }
}

 

posted on 2018-09-06 15:50  Zhe.Song  阅读(186)  评论(0编辑  收藏  举报