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  阅读(439)  评论(0编辑  收藏  举报

导航