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); }
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); }
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); }
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); }
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); }
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); }
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); }