表达式目录树与数据转换

我们可以通过动态拼装表达式目录树

  来实现俩个类的转换。

///


/// 生成表达式目录树 泛型缓存
///

///
///
public class ExpressionGenericMapper//Mapper`2
{
private static Func _FUNC = null;
static ExpressionGenericMapper()
{
ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn), "p");
List memberBindingList = new List();
foreach (var item in typeof(TOut).GetProperties())
{
MemberExpression property = Expression.Property(parameterExpression, typeof(TIn).GetProperty(item.Name));
MemberBinding memberBinding = Expression.Bind(item, property);
memberBindingList.Add(memberBinding);
}
foreach (var item in typeof(TOut).GetFields())
{
MemberExpression property = Expression.Field(parameterExpression, typeof(TIn).GetField(item.Name));
MemberBinding memberBinding = Expression.Bind(item, property);
memberBindingList.Add(memberBinding);
}
MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(TOut)), memberBindingList.ToArray());
Expression> lambda = Expression.Lambda>(memberInitExpression, new ParameterExpression[]
{
parameterExpression
});
_FUNC = lambda.Compile();//拼装是一次性的
}
public static TOut Trans(TIn t)
{
return _FUNC(t);
}

测试这种方式仅次于硬编码,速度大大高于反射和序列化。

转载于:https://www.cnblogs.com/yrz-hello/p/10318031.html

你可能感兴趣的:(表达式目录树与数据转换)