示例#1
0
        private static bool IsDefault <T>(ConstantExpression constant, out string translation)
        {
            if ((constant.Type == typeof(T)) && constant.Value.Equals(default(T)))
            {
                translation = $"default({typeof(T).Name})";
                return(true);
            }

            translation = null;
            return(false);
        }
示例#2
0
        private static bool IsRegex(ConstantExpression constant, out string translation)
        {
            if (constant.Type == typeof(Regex))
            {
                translation = nameof(Regex) + " /* " + constant.Value + " */";
                return(true);
            }

            translation = null;
            return(false);
        }
示例#3
0
        private static bool IsType(ConstantExpression constant, out string translation)
        {
            if (constant.Type.IsAssignableTo(typeof(Type)))
            {
                translation = $"typeof({((Type)constant.Value).GetFriendlyName()})";
                return(true);
            }

            translation = null;
            return(false);
        }
示例#4
0
        private static bool IsFunc(ConstantExpression constant, out string translation)
        {
            var match = _funcMatcher.Match(constant.Value.ToString());

            if (match.Success)
            {
                translation = ParseFuncFrom(match.Value);
                return(true);
            }

            translation = null;
            return(false);
        }
示例#5
0
        private static bool IsLambda(
            ConstantExpression constant,
            TranslationContext context,
            out string translation)
        {
            if (constant.Value is LambdaExpression lambda)
            {
                translation = context.TranslateAsCodeBlock(lambda);
                return(true);
            }
#if NET35
            if (constant.Value is System.Linq.Expressions.LambdaExpression linqLambda)
            {
                lambda      = (LambdaExpression)LinqExpressionToDlrExpressionConverter.Convert(linqLambda);
                translation = context.TranslateAsCodeBlock(lambda);
                return(true);
            }
#endif
            translation = null;
            return(false);
        }
示例#6
0
        private static bool TryTranslateByTypeCode(
            ConstantExpression constant,
            TranslationContext context,
            out string translation)
        {
            switch ((Nullable.GetUnderlyingType(constant.Type) ?? constant.Type).GetTypeCode())
            {
            case NetStandardTypeCode.Boolean:
                translation = constant.Value.ToString().ToLowerInvariant();
                return(true);

            case NetStandardTypeCode.Char:
                translation = $"'{constant.Value}'";
                return(true);

            case NetStandardTypeCode.DateTime:
                if (IsDefault <DateTime>(constant, out translation))
                {
                    return(true);
                }

                translation = TranslateDateTime((DateTime)constant.Value);
                return(true);

            case NetStandardTypeCode.DBNull:
                translation = "DBNull.Value";
                return(true);

            case NetStandardTypeCode.Decimal:
                translation = FormatNumeric((decimal)constant.Value) + "m";
                return(true);

            case NetStandardTypeCode.Double:
                translation = FormatNumeric((double)constant.Value) + "d";
                return(true);

            case NetStandardTypeCode.Int64:
                translation = constant.Value + "L";
                return(true);

            case NetStandardTypeCode.Object:
                if (IsType(constant, out translation) ||
                    IsLambda(constant, context, out translation) ||
                    IsFunc(constant, out translation) ||
                    IsRegex(constant, out translation) ||
                    IsDefault <Guid>(constant, out translation) ||
                    IsTimeSpan(constant, out translation))
                {
                    return(true);
                }
                break;

            case NetStandardTypeCode.Single:
                translation = FormatNumeric((float)constant.Value) + "f";
                return(true);

            case NetStandardTypeCode.String:
                var stringValue = (string)constant.Value;
                translation = stringValue.IsComment()
                        ? stringValue
                        : $"\"{stringValue.Replace("\"", "\\\"")}\"";
                return(true);
            }

            translation = null;
            return(false);
        }
示例#7
0
        private static bool IsTimeSpan(ConstantExpression constant, out string translation)
        {
            if (constant.Type != typeof(TimeSpan))
            {
                translation = null;
                return(false);
            }

            if (IsDefault <TimeSpan>(constant, out translation))
            {
                return(true);
            }

            var timeSpan = (TimeSpan)constant.Value;

            if (TryGetFactoryMethodCall(timeSpan.Days, timeSpan.TotalDays, "Days", out translation))
            {
                return(true);
            }

            if (TryGetFactoryMethodCall(timeSpan.Hours, timeSpan.TotalHours, "Hours", out translation))
            {
                return(true);
            }

            if (TryGetFactoryMethodCall(timeSpan.Minutes, timeSpan.TotalMinutes, "Minutes", out translation))
            {
                return(true);
            }

            if (TryGetFactoryMethodCall(timeSpan.Seconds, timeSpan.TotalSeconds, "Seconds", out translation))
            {
                return(true);
            }

            if (TryGetFactoryMethodCall(timeSpan.Milliseconds, timeSpan.TotalMilliseconds, "Milliseconds", out translation))
            {
                return(true);
            }

            if (timeSpan.Days != 0)
            {
                if (timeSpan.Milliseconds != 0)
                {
                    translation = $"new TimeSpan({timeSpan.Days}, {timeSpan.Hours}, {timeSpan.Minutes}, {timeSpan.Seconds}, {timeSpan.Milliseconds})";
                    return(true);
                }

                translation = $"new TimeSpan({timeSpan.Days}, {timeSpan.Hours}, {timeSpan.Minutes}, {timeSpan.Seconds})";
                return(true);
            }

            if ((timeSpan.Hours > 0) || (timeSpan.Minutes > 0) || (timeSpan.Seconds > 0))
            {
                translation = $"new TimeSpan({timeSpan.Hours}, {timeSpan.Minutes}, {timeSpan.Seconds})";
                return(true);
            }

            translation = $"TimeSpan.FromTicks({Math.Floor(timeSpan.TotalMilliseconds * 10000)})";
            return(true);
        }