C# 快速高效率复制对象另一种方式 表达式树
1.传统方式进行对象赋值 2.反射或序列化动态赋值 3.通过表达式结合缓存赋值合适大量的数据复制

具体实现代码
/// <summary>
/// 复制对象(反射)
/// </summary>
/// <typeparam name="TIn">复制需要的对象</typeparam>
/// <typeparam name="TOut">输出对象</typeparam>
/// <param name="tIn"></param>
/// <returns></returns>
private static TOut TransReflection<TIn, TOut>(TIn tIn)
{
TOut tOut = Activator.CreateInstance<TOut>();
foreach (var itemOut in tOut.GetType().GetProperties())
{
var itemIn = tIn.GetType().GetProperties().Where(i => i.Name == itemOut.Name).FirstOrDefault();
if (itemIn != null)
{
itemOut.SetValue(tOut, itemIn.GetValue(tIn));
Console.WriteLine(itemIn.GetValue(tIn));
}
}
return tOut;
}
/// <summary>
/// 表达式树 复制对象通用代码
/// </summary>
/// <typeparam name="TIn">复制需要的对象</typeparam>
/// <typeparam name="TOut">输出对象</typeparam>
/// <param name="tIn"></param>
/// <returns></returns>
private static TOut TransExp<TIn, TOut>(TIn tIn)
{
string key = string.Format("trans_exp_{0}_{1}", typeof(TIn).FullName, typeof(TOut).FullName);
if (!_Dic.ContainsKey(key))
{
ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn), "p");
List<MemberBinding> memberBindingList = new List<MemberBinding>();
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);
}
MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(TOut)), memberBindingList.ToArray());
Expression<Func<TIn, TOut>> lambda = Expression.Lambda<Func<TIn, TOut>>(memberInitExpression, new ParameterExpression[] { parameterExpression });
Func<TIn, TOut> func = lambda.Compile();
_Dic[key] = func;
}
return ((Func<TIn, TOut>)_Dic[key])(tIn);
}
原文:http://www.cnblogs.com/emrys5/p/expression_trans_model.html

浙公网安备 33010602011771号