using System.Linq.Expressions; using System.Reflection; namespace Tnb.Common.Utils { public class DeepCopyHelper where T : class, new() // 需要无参构造函数,构造表达式树的时候需要利用无参构造函数创建对象 { /// /// 映射表达式,泛型缓存每个类型存一份 /// private static readonly Func s_CopyFunc = null; /// /// 静态构造函数,每个泛型类型会且只会执行一次 /// static DeepCopyHelper() { BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; ParameterExpression parameterExpression = Expression.Parameter(typeof(T), "m"); // 参数m :m => List memberBindingList = new List(); foreach (var item in typeof(T).GetProperties(bindingFlags)) { if (!item.CanWrite) // 只读属性不拷贝 { continue; } MemberExpression property = Expression.Property(parameterExpression, item); // m.Name MemberBinding memberBinding = Expression.Bind(item, property); // Name = m.Name memberBindingList.Add(memberBinding); } foreach (var item in typeof(T).GetFields(bindingFlags)) { MemberExpression property = Expression.Field(parameterExpression, item); MemberBinding memberBinding = Expression.Bind(item, property); memberBindingList.Add(memberBinding); } MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(T)), memberBindingList.ToArray());// new T() {Name = m.Name} Expression> lambda = Expression.Lambda>(memberInitExpression, new ParameterExpression[] { parameterExpression }); // m => new T() {Name = m.Name} s_CopyFunc = lambda.Compile(); } /// /// 对象拷贝(拷贝private/public:实例成员、属性、静态成员) /// /// 源 /// public static T DeepCopy(T data) { return s_CopyFunc(data); } /// /// 集合拷贝(拷贝private/public:实例成员、属性、静态成员) /// /// 源 /// public static List DeepCopyList(List data) { if (data == null || data.Count < 1) { return Enumerable.Empty().ToList(); } return data.Select(a => DeepCopy(a)).ToList(); } } }