/// <summary> /// 获取属性表达式 /// </summary> /// <param name="expression">表达式</param> /// <param name="property">属性信息</param> /// <returns>属性表达式</returns> internal static TmphPropertyExpression Get(TmphExpression expression, PropertyInfo property) { var propertyExpression = TmphTypePool<TmphPropertyExpression>.Pop() ?? new TmphPropertyExpression(); propertyExpression.PropertyInfo = property; propertyExpression.set(expression); return propertyExpression; }
/// <summary> /// 获取字段表达式 /// </summary> /// <param name="expression">表达式</param> /// <param name="field">字段信息</param> /// <returns>字段表达式</returns> internal static TmphFieldExpression Get(TmphExpression expression, FieldInfo field) { var fieldExpression = TmphTypePool<TmphFieldExpression>.Pop() ?? new TmphFieldExpression(); fieldExpression.FieldInfo = field; fieldExpression.set(expression); return fieldExpression; }
/// <summary> /// 委托关联表达式 /// </summary> /// <param name="body">表达式主体</param> /// <param name="parameters">参数</param> protected void set(TmphExpression body, TmphParameterExpression[] parameters) { ++(Body = body.SimpleExpression).ExpressionCount; Parameters = parameters; if (parameters != null) { foreach (var parameter in parameters) ++parameter.ExpressionCount; } }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertConstant(Expression.TmphConverter converter, TmphExpression expression) { var value = ((TmphConstantExpression)expression).Value; if (value != null) { var toString = TmphConstantConverter.Default[value.GetType()]; if (toString != null) toString(converter.Stream, value); else TmphConstantConverter.ConvertConstantStringQuote(converter.Stream, value.ToString()); } else TmphAjax.WriteNull(converter.Stream); }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertInSet(Expression.TmphConverter converter, TmphExpression expression) { var stream = converter.Stream; var binaryExpression = (TmphBinaryExpression)expression; var left = binaryExpression.Left; converters[(int)left.NodeType](converter, left); stream.WriteNotNull(" In("); Action<TmphCharStream, object> toString = null; var index = -1; foreach (var value in (IEnumerable)((TmphConstantExpression)binaryExpression.Right).Value) { if (++index == 0) toString = TmphConstantConverter.Default[value.GetType()]; else stream.Write(','); if (toString == null) TmphConstantConverter.ConvertConstantStringQuote(stream, value.ToString()); else toString(stream, value); } stream.Write(')'); }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertPower(TmphConverter converter, TmphExpression expression) { TmphLog.Error.Throw(TmphLog.TmphExceptionType.ErrorOperation); }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="unaryExpression">表达式</param> private void convertUnbox(TmphConverter converter, TmphExpression expression) { expression = ((TmphUnaryExpression)expression).Expression; if (expression.IsSimple) { converters[(int)expression.NodeType](converter, expression); } else { converter.Stream.Write('('); converters[(int)expression.NodeType](converter, expression); converter.Stream.Write(')'); } }
/// <summary> /// 获取函数调用表达式 /// </summary> /// <param name="method">函数信息</param> /// <param name="instance">动态函数对象表达式</param> /// <param name="arguments">调用参数</param> /// <returns>函数调用表达式</returns> internal static TmphMethodCallExpression Get(MethodInfo method, TmphExpression instance, TmphExpression[] arguments) { var expression = TmphTypePool<TmphMethodCallExpression>.Pop() ?? new TmphMethodCallExpression(); expression.set(method, instance, arguments); return expression; }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertModulo(TmphConverter converter, TmphExpression expression) { convertBinaryExpression(converter, (TmphBinaryExpression)expression, '%'); }
/// <summary> /// 成员表达式 /// </summary> /// <param name="expression">表达式</param> protected void set(TmphExpression expression) { ++(Expression = expression.SimpleExpression).ExpressionCount; IsSimple = true; IsConstant = Expression.IsConstant; }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertAnd(TmphConverter converter, TmphExpression expression) { convertBinaryExpression(converter, (TmphBinaryExpression)expression, '&'); }
/// <summary> /// 一元表达式 /// </summary> /// <param name="type">表达式类型</param> /// <param name="expression">表达式</param> /// <param name="method">运算符重载函数</param> protected void set(TmphExpressionType type, TmphExpression expression, MethodInfo method) { NodeType = type; Method = method; ++(Expression = expression.SimpleExpression).ExpressionCount; }
/// <summary> /// 获取委托关联表达式 /// </summary> /// <param name="body">表达式主体</param> /// <param name="parameters">参数</param> /// <returns>委托关联表达式</returns> internal static TmphLambdaExpression Get(TmphExpression body, TmphParameterExpression[] parameters) { var expression = TmphTypePool<TmphLambdaExpression>.Pop() ?? new TmphLambdaExpression(); expression.set(body, parameters); return expression; }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertExclusiveOr(TmphConverter converter, TmphExpression expression) { convertBinaryExpression(converter, (TmphBinaryExpression)expression, '^'); }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertPropertyAccess(TmphConverter converter, TmphExpression expression) { var propertyExpression = (TmphPropertyExpression)expression; convertMemberAccess(converter, propertyExpression, propertyExpression.PropertyInfo.Name); }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertFieldAccess(TmphConverter converter, TmphExpression expression) { var fieldExpression = (TmphFieldExpression)expression; convertMemberAccess(converter, fieldExpression, fieldExpression.FieldInfo.Name); }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertRightShift(TmphConverter converter, TmphExpression expression) { convertBinaryExpression(converter, (TmphBinaryExpression)expression, '>', '>'); }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertLeftShift(TmphConverter converter, TmphExpression expression) { convertBinaryExpression(converter, (TmphBinaryExpression)expression, '<', '<'); }
/// <summary> /// 获取条件表达式 /// </summary> /// <param name="test">测试条件</param> /// <param name="ifTrue">真表达式</param> /// <param name="ifFalse">假表达式</param> /// <returns>条件表达式</returns> internal static TmphConditionalExpression Get(TmphExpression test, TmphExpression ifTrue, TmphExpression ifFalse) { var expression = TmphTypePool<TmphConditionalExpression>.Pop() ?? new TmphConditionalExpression(); ++(expression.Test = test.SimpleExpression).ExpressionCount; ++(expression.IfTrue = ifTrue.SimpleExpression).ExpressionCount; ++(expression.IfFalse = ifFalse.SimpleExpression).ExpressionCount; return expression; }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="unaryExpression">表达式</param> private void convertUnaryPlus(TmphConverter converter, TmphExpression expression) { expression = ((TmphUnaryExpression)expression).Expression; converter.Stream.WriteNotNull("+("); converters[(int)expression.NodeType](converter, expression); converter.Stream.Write(')'); }
/// <summary> /// 获取一元表达式 /// </summary> /// <param name="type">表达式类型</param> /// <param name="expression">表达式</param> /// <param name="method">运算符重载函数</param> /// <returns>一元表达式</returns> internal static TmphUnaryExpression Get(TmphExpressionType type, TmphExpression expression, MethodInfo method) { var unaryExpression = TmphTypePool<TmphUnaryExpression>.Pop() ?? new TmphUnaryExpression(); unaryExpression.set(type, expression, method); return unaryExpression; }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="unaryExpression">表达式</param> private void convertIsFalse(TmphConverter converter, TmphExpression expression) { expression = ((TmphUnaryExpression)expression).Expression; if (expression.IsSimple) { converters[(int)expression.NodeType](converter, expression); converter.Stream.WriteNotNull("=0"); } else { converter.Stream.Write('('); converters[(int)expression.NodeType](converter, expression); converter.Stream.WriteNotNull(")=0"); } }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="unaryExpression">表达式</param> private void convertConvert(TmphConverter converter, TmphExpression expression) { var convertExpression = (TmphConvertExpression)expression; converter.Stream.WriteNotNull("cast("); converters[(int)convertExpression.Expression.NodeType](converter, convertExpression.Expression); converter.Stream.WriteNotNull(" as "); converter.Stream.WriteNotNull(convertExpression.ConvertType.formCSharpType().ToString()); converter.Stream.Write(')'); }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertConditional(TmphConverter converter, TmphExpression expression) { var stream = converter.Stream; var conditionalExpression = (TmphConditionalExpression)expression; TmphExpression test = conditionalExpression.Test, ifTrue = conditionalExpression.IfTrue, ifFalse = conditionalExpression.IfFalse; stream.WriteNotNull("case when "); if (test.IsSimple) { converters[(int)test.NodeType](converter, test); stream.Write('='); stream.Write('1'); } else converters[(int)test.NodeType](converter, test); stream.WriteNotNull(" then "); if (ifTrue.IsSimple) converters[(int)ifTrue.NodeType](converter, ifTrue); else { stream.Write('('); converters[(int)ifTrue.NodeType](converter, ifTrue); stream.Write(')'); } stream.WriteNotNull(" else "); if (ifFalse.IsSimple) converters[(int)ifFalse.NodeType](converter, ifFalse); else { stream.Write('('); converters[(int)ifFalse.NodeType](converter, ifFalse); stream.Write(')'); } stream.WriteNotNull(" end"); }
/// <summary> /// 清除数据 /// </summary> protected void clear() { Expression.PushCountPool(); Expression = null; }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertCall(TmphConverter converter, TmphExpression expression) { var methodCallExpression = (TmphMethodCallExpression)expression; var stream = converter.Stream; stream.WriteNotNull(methodCallExpression.Method.Name); stream.Write('('); if (methodCallExpression.Arguments != null) { var isNext = false; foreach (var argumentExpression in methodCallExpression.Arguments) { if (isNext) stream.Write(','); converters[(int)argumentExpression.NodeType](converter, argumentExpression); isNext = true; } } stream.Write(')'); }
/// <summary> /// 函数调用表达式 /// </summary> /// <param name="method">函数信息</param> /// <param name="instance">动态函数对象表达式</param> /// <param name="arguments">调用参数</param> private void set(MethodInfo method, TmphExpression instance, TmphExpression[] arguments) { Method = method; if (instance != null) ++(Instance = instance.SimpleExpression).ExpressionCount; if (arguments.length() != 0) { var index = 0; foreach (var expression in arguments) ++(arguments[index++] = expression.SimpleExpression).ExpressionCount; Arguments = arguments; } }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertOrElse(TmphConverter converter, TmphExpression expression) { convertBinaryExpression(converter, (TmphBinaryExpression)expression, "or"); }
/// <summary> /// 获取二元表达式 /// </summary> /// <param name="type">表达式类型</param> /// <param name="left">左表达式</param> /// <param name="right">右表达式</param> /// <param name="method">运算符重载函数</param> /// <returns>二元表达式</returns> internal static TmphBinaryExpression Get(TmphExpressionType type, TmphExpression left, TmphExpression right, MethodInfo method) { var expression = TmphTypePool<TmphBinaryExpression>.Pop() ?? new TmphBinaryExpression(); expression.NodeType = type; expression.Method = method; ++(expression.Left = left.SimpleExpression).ExpressionCount; ++(expression.Right = right.SimpleExpression).ExpressionCount; return expression; }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertDivide(TmphConverter converter, TmphExpression expression) { convertBinaryExpression(converter, (TmphBinaryExpression)expression, '/'); }