using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace PLCCommunication.Common { public class ModelTools { public static class PubClone { private static readonly Func cache = GetFunc(); private static Func GetFunc() { ParameterExpression parameterExpression = Expression.Parameter(typeof(TEntity), "p"); List memberBindingList = new List(); foreach (var item in typeof(TResult).GetProperties()) { if (!item.CanWrite) { continue; } var _Property = typeof(TEntity).GetProperty(item.Name); if (_Property == null) { continue; } if (item.PropertyType.FullName != _Property.PropertyType.FullName) { continue; } MemberExpression property = Expression.Property(parameterExpression, typeof(TEntity).GetProperty(item.Name)); MemberBinding memberBinding = Expression.Bind(item, property); memberBindingList.Add(memberBinding); } MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(TResult)), memberBindingList.ToArray()); Expression> lambda = Expression.Lambda>(memberInitExpression, new ParameterExpression[] { parameterExpression }); return lambda.Compile(); } public static TResult Trans(TEntity tIn) { if (tIn == null) { return default(TResult); } return cache(tIn); } public static List TransList(List list) { List result = new List(); foreach (var item in list) { result.Add(Trans(item)); } return result; } } } }