/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> /// <param name="type">操作字符串</param> private void convertBinaryExpression(TmphConverter converter, TmphBinaryExpression binaryExpression, string type) { var stream = converter.Stream; TmphExpression left = binaryExpression.Left, right = binaryExpression.Right; stream.Write('('); if (left.IsSimple) { converters[(int)left.NodeType](converter, left); stream.Write('='); stream.Write('1'); } else converters[(int)left.NodeType](converter, left); stream.Write(')'); stream.WriteNotNull(type); stream.Write('('); if (right.IsSimple) { converters[(int)right.NodeType](converter, right); stream.Write('='); stream.Write('1'); } else converters[(int)right.NodeType](converter, right); stream.Write(')'); }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertNotEqual(TmphConverter converter, TmphExpression expression) { var binaryExpression = (TmphBinaryExpression)expression; if (binaryExpression.Left.IsConstantNull) { var stream = converter.Stream; if (binaryExpression.Right.IsSimple) { converters[(int)binaryExpression.Right.NodeType](converter, binaryExpression.Right); } else { stream.Write('('); converters[(int)binaryExpression.Right.NodeType](converter, binaryExpression.Right); stream.Write(')'); } stream.WriteNotNull(" is not null"); } else if (binaryExpression.Right.IsConstantNull) { var stream = converter.Stream; if (binaryExpression.Left.IsSimple) { converters[(int)binaryExpression.Left.NodeType](converter, binaryExpression.Left); } else { stream.Write('('); converters[(int)binaryExpression.Left.NodeType](converter, binaryExpression.Left); stream.Write(')'); } stream.WriteNotNull(" is not null"); } else convertNotEqual(converter, (TmphBinaryExpression)expression); }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> /// <param name="char1">操作字符1</param> /// <param name="char2">操作字符2</param> protected void convertBinaryExpression(TmphConverter converter, TmphBinaryExpression binaryExpression, char char1, char char2 = ' ') { var stream = converter.Stream; TmphExpression left = binaryExpression.Left, right = binaryExpression.Right; if (left.IsSimple) { converters[(int)left.NodeType](converter, left); } else { stream.Write('('); converters[(int)left.NodeType](converter, left); stream.Write(')'); } stream.Write(char1); stream.Write(char2); if (right.IsSimple) { converters[(int)right.NodeType](converter, right); } else { stream.Write('('); converters[(int)right.NodeType](converter, right); stream.Write(')'); } }
/// <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 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="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="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="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertDivide(TmphConverter converter, TmphExpression expression) { convertBinaryExpression(converter, (TmphBinaryExpression)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="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertSubtract(TmphConverter converter, TmphExpression expression) { convertBinaryExpression(converter, (TmphBinaryExpression)expression, '-'); }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertMultiply(TmphConverter converter, TmphExpression expression) { convertBinaryExpression(converter, (TmphBinaryExpression)expression, '*'); }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertLessThanOrEqual(TmphConverter converter, TmphExpression expression) { convertBinaryExpression(converter, (TmphBinaryExpression)expression, '<', '='); }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertGreaterThan(TmphConverter converter, TmphExpression expression) { convertBinaryExpression(converter, (TmphBinaryExpression)expression, '>'); }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> protected virtual void convertNotEqual(TmphConverter converter, TmphBinaryExpression expression) { convertBinaryExpression(converter, expression, '<', '>'); }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> /// <param name="name">成员名称</param> private void convertMemberAccess(TmphConverter converter, TmphMemberExpression memberExpression, string name) { if (memberExpression.Expression.GetType() == typeof(TmphParameterExpression)) { if (converter.FirstMemberName == null) converter.FirstMemberName = name; converter.Stream.WriteNotNull(name); } else TmphLog.Error.Throw("未知成员表达式类型 " + memberExpression.Expression.GetType().Name, false, true); }
/// <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="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 convertAnd(TmphConverter converter, TmphExpression expression) { convertBinaryExpression(converter, (TmphBinaryExpression)expression, '&'); }
/// <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="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="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="expression">表达式</param> private void convertLeftShift(TmphConverter converter, TmphExpression expression) { convertBinaryExpression(converter, (TmphBinaryExpression)expression, '<', '<'); }
/// <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> /// <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 convertOrElse(TmphConverter converter, TmphExpression expression) { convertBinaryExpression(converter, (TmphBinaryExpression)expression, "or"); }
/// <summary> /// 转换表达式 /// </summary> /// <param name="converter">表达式转换器</param> /// <param name="expression">表达式</param> private void convertAndAlso(TmphConverter converter, TmphExpression expression) { convertBinaryExpression(converter, (TmphBinaryExpression)expression, "and"); }