-
C#教程之解析Expression
本站最新发布 C#从入门到精通
试听地址 https://www.xin3721.com/eschool/CSharpxin3721/
试听地址 https://www.xin3721.com/eschool/CSharpxin3721/
private static void GetExpression<T2>(Expression expression) { if (expression.NodeType != ExpressionType.Constant) { var _expression = expression as BinaryExpression; if (_expression == null || expression.NodeType == ExpressionType.Lambda) { _expression = GetBinaryExpression(expression); } if (AnyBinaryOperator(_expression.NodeType)) { var _leftExpression = _expression.Left; GetExpression<T2>(_leftExpression); var _rightExpression = _expression.Right; GetExpression<T2>(_rightExpression); } else { Results.Add(GetExpressionResult<T2>(_expression)); } } }
/// <summary> /// escape to the lambda /// </summary> private static BinaryExpression GetBinaryExpression(Expression expression) { LambdaExpression lambda = expression as LambdaExpression; var lambdaExpression = lambda.Body; return lambdaExpression as BinaryExpression; }
/// <summary> /// get result /// </summary> private static ExpressionResult GetExpressionResult<T2>(BinaryExpression expression) { var left_Name = GetLeftExpression<T2>(expression); var right_Name = GetRightExpression(expression); return new ExpressionLambdaResult() { expressionType = expression.NodeType, propertyName = left_Name, propertyValue = right_Name }; }
/// <summary> /// get dto attribute /// </summary> private static string GetLeftExpression<T2>(BinaryExpression expression) { var leftExpression = expression.Left as MemberExpression; var ps = typeof(T2).GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); var first = ps.Where(x => x.GetCustomAttribute<EntityDataNameAttribute>(true) != null && x.Name.ToLower() == leftExpression.Member.Name.ToLower()).FirstOrDefault(); return first != null ? first.GetCustomAttribute<EntityDataNameAttribute>(true).EntityDataName : leftExpression.Member.Name; }
/// <summary> /// get constant value /// </summary> private static object GetRightExpression(BinaryExpression expression) { var rootExpression = expression.Right as MemberExpression; var constExpr = rootExpression.Expression as ConstantExpression; if (constExpr == null) { object value = Expression.Lambda(expression.Right).Compile().DynamicInvoke(); if (value == null) return value = string.Empty; if (getPropertyType(value.GetType()) == typeof(Nullable)) { var ps = value.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); var first = ps.Where(x => x.GetCustomAttribute<EntityDataNameAttribute>(true) != null).FirstOrDefault(); if (first == null) { throw new Exception(" Attribute is empty "); } value = value.GetType().GetProperty(first.Name).GetValue(value, null); } else if (getPropertyType(value.GetType()) == typeof(ListClass)) { } return value; } else { var memberInfos = new Stack<MemberInfo>(); memberInfos.Push(rootExpression.Member); object objReference = constExpr.Value; var mi = memberInfos.Pop(); var objField = objReference.GetType().GetField(mi.Name); return objField.GetValue(objReference); } }
/// <summary> /// any binary operator /// </summary> /// <param name="expressiontype"></param> /// <returns></returns> private static bool AnyBinaryOperator(ExpressionType expressiontype) { bool Any = true; switch (expressiontype) { case ExpressionType.AndAlso: break; case ExpressionType.And: break; case ExpressionType.OrElse: break; case ExpressionType.Or:break; default: Any = !Any; break; } return Any; }
public class ExpressionLambdaResult: ExpressionResult { public string propertyName { get; set; } public object propertyValue { get; set; } } public class ExpressionResult { public ExpressionType expressionType { get; set; } }
栏目列表
最新更新
C# 面向对象
假设客车的座位数是9行4列,使用二维数
C#基于接口设计三层架构Unity篇
C#线程 入门
C#读取静态类常量属性和值
C# 插件式编程
C# 委托与事件有啥区别?
C#队列学习笔记:队列(Queue)和堆栈(Stack
linq 多表分组左连接查询查询统计
C#队列学习笔记:MSMQ入门一
C# 在Word中添加Latex 数学公式和符号
inncheck命令 – 检查语法
基于UDP的服务器端和客户端
再谈UDP和TCP
在socket编程中使用域名
网络数据传输时的大小端问题
socket编程实现文件传输功能
如何优雅地断开TCP连接?
图解TCP四次握手断开连接
详细分析TCP数据的传输过程
SqlServer 利用游标批量更新数据
BOS只读状态修改
SQL Server等待事件—PAGEIOLATCH_EX
数据库多行转换为单一列
获取数据表最后最后访问,修改,更新,
计算经历的时间
SQL查询结果自定义排序
修改数据库默认位置
日期简单加或减
从日期获取年,月或日