| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- using System;
- using System.Linq.Expressions;
- using System.Reflection;
- using System.Text;
- namespace ETModel
- {
- public sealed class ExpressionVistor: ExpressionVisitor
- {
- private readonly StringBuilder Builder = new StringBuilder("{");
- public string Output
- {
- get
- {
- return this.Builder.ToString();
- }
- }
- private string Variable;
- private ExpressionType NodeType;
- public ExpressionVistor(Expression node)
- {
- Visit(node);
- }
- protected override Expression VisitLambda<T>(Expression<T> node)
- {
- Expression lambda = base.VisitLambda(node);
- this.Builder.Remove(this.Builder.Length - 1, 1); //Remove the Last Comma
- this.Builder.Append("}");
- return lambda;
- }
- protected override Expression VisitBinary(BinaryExpression node)
- {
- this.NodeType = node.NodeType;
- return base.VisitBinary(node);
- }
- protected override Expression VisitMember(MemberExpression node)
- {
- switch (node.Expression.NodeType)
- {
- case ExpressionType.Constant:
- case ExpressionType.MemberAccess:
- {
- ConstantExpression cleanNode = GetMemberConstant(node);
- return VisitConstant(cleanNode);
- }
- }
- if (node.Member.Name != nameof(ComponentWithId.Id))
- {
- this.Variable = node.Member.Name;
- }
- else
- {
- this.Variable = "_id";
- }
- return base.VisitMember(node);
- }
- private static ConstantExpression GetMemberConstant(MemberExpression node)
- {
- object value;
- switch (node.Member.MemberType)
- {
- case MemberTypes.Field:
- value = GetFieldValue(node);
- break;
- case MemberTypes.Property:
- value = GetPropertyValue(node);
- break;
- default:
- throw new NotSupportedException();
- }
- return Expression.Constant(value, node.Type);
- }
-
- protected override Expression VisitConstant(ConstantExpression node)
- {
- this.Builder.Append(this.Variable);
- bool flag = false;
- switch (this.NodeType)
- {
- case ExpressionType.Equal:
- this.Builder.Append(":");
- break;
- case ExpressionType.GreaterThan:
- this.Builder.Append(":{");
- this.Builder.Append("$gt:");
- flag = true;
- break;
- case ExpressionType.GreaterThanOrEqual:
- this.Builder.Append(":{");
- this.Builder.Append("$gte:");
- flag = true;
- break;
- case ExpressionType.LessThan:
- this.Builder.Append(":{");
- this.Builder.Append("$lt:");
- flag = true;
- break;
- case ExpressionType.LessThanOrEqual:
- this.Builder.Append(":{");
- this.Builder.Append("lte:");
- flag = true;
- break;
- }
- this.Builder.Append(node.Value);
- if (flag)
- {
- this.Builder.Append("}");
- }
- this.Builder.Append(",");
- return base.VisitConstant(node);
- }
-
- private static object GetFieldValue(MemberExpression node)
- {
- FieldInfo fieldInfo = (FieldInfo)node.Member;
- object instance = node.Expression == null ? null : TryEvaluate(node.Expression).Value;
- return fieldInfo.GetValue(instance);
- }
- private static object GetPropertyValue(MemberExpression node)
- {
- PropertyInfo propertyInfo = (PropertyInfo)node.Member;
- object instance = node.Expression == null ? null : TryEvaluate(node.Expression).Value;
- return propertyInfo.GetValue(instance, null);
- }
-
- private static ConstantExpression TryEvaluate(Expression expression)
- {
- if (expression.NodeType != ExpressionType.Constant)
- {
- throw new NotSupportedException();
- }
- return (ConstantExpression)expression;
- }
- }
- }
|