C# 快速高效率复制对象另一种方式 表达式树
作者:Emrys
出处:http://www.cnblogs.com/emrys5/
原文地址:https://www.cnblogs.com/emrys5/p/expression_trans_model.html
在Emrys 的文章中 3.4 利用泛型的特性再次优化代码,中的代码,做了一下优化,以下为代码红色部分为修改内容
public class TransExpressionConvert<TIn, TOut>
{
private static readonly Func<TIn, TOut> TransFunc = GetFunc();
private static Func<TIn, TOut> GetFunc()
{
var tInType = typeof(TIn);
var tOutType = typeof(TOut);
ParameterExpression parameterExpression = Expression.Parameter(tInType, "param");
List<MemberBinding> memberBindingList = new List<MemberBinding>();
foreach (var item in tOutType.GetProperties())
{
if (!item.CanWrite)
continue;
var propertyInfo = tInType.GetProperty(item.Name);
if (propertyInfo == null || propertyInfo.PropertyType != item.PropertyType)
continue;
MemberExpression property = Expression.Property(parameterExpression, propertyInfo);
MemberBinding memberBinding = Expression.Bind(item, property);
memberBindingList.Add(memberBinding);
}
MemberInitExpression memberInitExpression =
Expression.MemberInit(Expression.New(tOutType), memberBindingList.ToArray());
Expression<Func<TIn, TOut>> lambda =
Expression.Lambda<Func<TIn, TOut>>(memberInitExpression, parameterExpression);
return lambda.Compile();
}
public static TOut Trans(TIn tIn)
{
return TransFunc(tIn);
}
}
posted on 2019-05-09 16:46 Live_learn 阅读(443) 评论(0) 编辑 收藏 举报