应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

Expression表达式树类型转换

6761人阅读 2021/10/14 22:06 总访问:5195119 评论:0 收藏:0 手机
分类: .NET

问题描述:
Expression<Func<AClass,bool>> expression 如何转成Expression<Func<BClass,bool>> expression 其中类型的属性相同。

解决方法:
使用ExpressionVisitor,去遍历表达式树,然后重建目标类型的表达式

效果如下,可以把Expression<Func<AClass,bool>> 转换成Expression<Func<BClass,bool>>:


代码如下:
测试代码:

  1. public class AClass
  2. {
  3. }
  4. public class BClass
  5. {
  6. }
  7. class Program2
  8. {
  9.     static void Main(string[] args)
  10.     {
  11.         Expression<Func<AClass, bool>> expression = a => true;
  12.         AJExpressionVisitor<BClass> ufExpressionVisitor = new AJExpressionVisitor<BClass>();
  13.         Expression<Func<BClass, bool>> lamdba =
  14.             ufExpressionVisitor.Modify(expression) as Expression<Func<BClass, bool>>;
  15.         Test(lamdba);
  16.     }
  17.     public static void Test(Expression<Func<BClass, bool>> expression)
  18.     {
  19.         //解析.....
  20.     }
  21. }

转换类:

  1. /// <summary>
  2. /// 转换类
  3. /// </summary>
  4. public class AJExpressionVisitor<X> : ExpressionVisitor
  5. {
  6.     /// <summary>
  7.     /// 替换参数
  8.     /// </summary>
  9.     public ParameterExpression pe { get; set; }
  10.     public AJExpressionVisitor()
  11.     {
  12.         var parameter = Expression.Parameter(typeof(X), "a");
  13.         this.pe = parameter;
  14.     }
  15.     /// <summary>
  16.     /// 修改表达式
  17.     /// </summary>
  18.     /// <param name="expression">待修改的表达式</param>
  19.     /// <returns>修改后的表达式</returns>
  20.     public Expression Modify(Expression expression)
  21.     {
  22.         return this.Visit(expression);
  23.     }
  24.     protected override Expression VisitLambda<T>(Expression<T> node)
  25.     {
  26.         return Expression.Lambda(Traverse(node.Body), pe);
  27.     }
  28.     /// <summary>
  29.     /// 遍历转换表达式
  30.     /// </summary>
  31.     /// <param name="expression">表达式</param>
  32.     /// <returns>转换后的表达式</returns>
  33.     private Expression Traverse(Expression expression)
  34.     {
  35.         //二无表达式的处理
  36.         if (expression is BinaryExpression)
  37.         {
  38.             var left = Traverse((expression as BinaryExpression).Left);
  39.             var right = Traverse((expression as BinaryExpression).Right);
  40.             return Expression.MakeBinary((expression as BinaryExpression).NodeType, left, right);
  41.         }
  42.         //成员表达式的处理
  43.         if (expression is MemberExpression)
  44.         {
  45.             MemberExpression me = Expression.Property(pe, (expression as MemberExpression).Member.Name);
  46.             return me;
  47.         }
  48.         //常量表达式的处理
  49.         if (expression is ConstantExpression)
  50.         {
  51.             return expression;
  52.         }
  53.         //方法调用表达式的处理
  54.         if (expression is MethodCallExpression)
  55.         {
  56.             var mcExpression = expression as MethodCallExpression;
  57.             var body = Traverse(mcExpression.Object);
  58.             return Expression.Call(body, mcExpression.Method, mcExpression.Arguments);
  59.         }
  60.         return expression;
  61.     }
  62. }


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价