ExpressionGenericMapper.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace ShwasherSys.ReflectionMagic
  8. {
  9. public class ExpressionGenericMapper<TIn,TOut>
  10. {
  11. private static Func<TIn, TOut> _FUNC = null;
  12. static ExpressionGenericMapper()
  13. {
  14. ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn), "p");
  15. List<MemberBinding> memberBindingList = new List<MemberBinding>();
  16. foreach (var item in typeof(TOut).GetProperties())
  17. {
  18. MemberExpression property =
  19. Expression.Property(parameterExpression, typeof(TIn).GetProperty(item.Name));
  20. MemberBinding memberBinding = Expression.Bind(item, property);
  21. memberBindingList.Add(memberBinding);
  22. }
  23. foreach (var item in typeof(TOut).GetFields())
  24. {
  25. MemberExpression property =
  26. Expression.Property(parameterExpression, typeof(TIn).GetProperty(item.Name));
  27. MemberBinding memberBinding = Expression.Bind(item, property);
  28. memberBindingList.Add(memberBinding);
  29. }
  30. MemberInitExpression memberInitExpression =
  31. Expression.MemberInit(Expression.New(typeof(TOut)), memberBindingList.ToArray());
  32. Expression<Func<TIn, TOut>> lambda = Expression.Lambda<Func<TIn, TOut>>(memberInitExpression,
  33. new ParameterExpression[]
  34. {
  35. parameterExpression
  36. });
  37. _FUNC = lambda.Compile();
  38. }
  39. public static TOut Trans(TIn t)
  40. {
  41. return _FUNC(t);
  42. }
  43. }
  44. }