作者:emrys 
出处: 

原文地址: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);
}
}