ExpressionExtentions.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using Masuit.Tools.Mapping.Visitor;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq.Expressions;
  5. namespace Masuit.Tools.Mapping.Extensions
  6. {
  7. /// <summary>
  8. ///表达式树扩展
  9. /// </summary>
  10. public static class ExpressionExtentions
  11. {
  12. /// <summary>
  13. /// 转换
  14. /// </summary>
  15. /// <typeparam name="TFrom">源类型</typeparam>
  16. /// <param name="from">来源</param>
  17. /// <param name="toType">目标类型</param>
  18. /// <returns></returns>
  19. public static Expression ConvertTo<TFrom>(this Expression<Func<TFrom, object>> from, Type toType)
  20. {
  21. return ConvertImpl(from, toType);
  22. }
  23. /// <summary>
  24. /// 转换
  25. /// </summary>
  26. /// <typeparam name="TFrom">源类型</typeparam>
  27. /// <param name="from">来源</param>
  28. /// <param name="toType">目标类型</param>
  29. /// <returns></returns>
  30. public static Expression ConvertTo<TFrom>(this Expression<Func<TFrom, bool>> from, Type toType)
  31. {
  32. return ConvertImpl(from, toType);
  33. }
  34. /// <summary>
  35. /// 转换Lambda表达式树
  36. /// </summary>
  37. /// <typeparam name="TFrom">源类型</typeparam>
  38. /// <typeparam name="TTo">目标类型</typeparam>
  39. /// <param name="from">来源</param>
  40. /// <returns></returns>
  41. public static Expression ConvertTo<TFrom, TTo>(this Expression<Func<TFrom, object>> from)
  42. {
  43. return ConvertImpl(from, typeof(TTo));
  44. }
  45. /// <summary>
  46. /// 转换表达式树
  47. /// </summary>
  48. /// <typeparam name="TFrom">源类型的表达式树</typeparam>
  49. /// <typeparam name="TTo">目标类型的表达式树</typeparam>
  50. /// <param name="from">源类型的表达式树</param>
  51. /// <returns>表达式转换或如果没有找到映射原始表达式。</returns>
  52. public static Expression<Func<TTo, bool>> ConvertTo<TFrom, TTo>(this Expression<Func<TFrom, bool>> from)
  53. {
  54. return (Expression<Func<TTo, bool>>)ConvertImpl(from, typeof(TTo));
  55. }
  56. private static Expression ConvertImpl<TFrom>(Expression<TFrom> from, Type toType) where TFrom : class
  57. {
  58. // 重新映射不同类型的所有参数
  59. Dictionary<Expression, Expression> parameterMap = new Dictionary<Expression, Expression>();
  60. ParameterExpression[] newParams = new ParameterExpression[from.Parameters.Count];
  61. for (int i = 0; i < newParams.Length; i++)
  62. {
  63. newParams[i] = Expression.Parameter(toType, from.Parameters[i].Name);
  64. parameterMap[from.Parameters[i]] = newParams[i];
  65. }
  66. // 重新构建表达式树
  67. var body = new ConverterExpressionVisitor(parameterMap, toType).Visit(from.Body);
  68. return Expression.Lambda(body, newParams);
  69. }
  70. }
  71. }