diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index e659cd8c84b6..e99b3610be66 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -41,258 +41,258 @@ https://github.com/dotnet/efcore 32fe1fd7afa3fa6c9af14c4f0da51068202491a1 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 https://github.com/dotnet/source-build-externals 487e3990066862c81960a6d053b9d04c67f9d2a8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 https://github.com/dotnet/xdt @@ -302,9 +302,9 @@ - + https://github.com/dotnet/runtime - e7926d6bb96976d9fc7aa1ac0a4e7a40f965b688 + 6123cb00bbec8ae3500c970890f5b0efcf7950e8 https://github.com/dotnet/arcade diff --git a/eng/Versions.props b/eng/Versions.props index 8698283776c7..1fa55d05cca9 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -63,69 +63,69 @@ --> - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 - 8.0.0-preview.3.23152.1 - 8.0.0-preview.3.23152.1 + 8.0.0-preview.3.23155.6 + 8.0.0-preview.3.23155.6 8.0.0-preview.3.23152.4 8.0.0-preview.3.23152.4 diff --git a/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs b/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs index b8bcc470c8dd..1b1613d4be91 100644 --- a/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs +++ b/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs @@ -165,6 +165,13 @@ private static Task WriteToResponseAsync(T? value, HttpContext httpContext, J return T.BindAsync(context, parameter); } } + + {{GeneratedCodeAttribute}} + file static class ParsableHelper where T : IParsable + { + public static T Parse(string s, IFormatProvider? provider) => T.Parse(s, provider); + public static bool TryParse(string? s, IFormatProvider? provider, [MaybeNullWhen(returnValue: false)] out T result) => T.TryParse(s, provider, out result); + } } """; private static string GetGenericThunks(string genericThunks) => genericThunks != string.Empty ? $$""" diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointParameter.cs b/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointParameter.cs index d1a12e428d1d..1e09f813ccb0 100644 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointParameter.cs +++ b/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/EndpointParameter.cs @@ -122,7 +122,7 @@ private bool TryGetParsability(IParameterSymbol parameter, WellKnownTypes wellKn // which method was encountered. Func? preferredTryParseInvocation = parsabilityMethod switch { - ParsabilityMethod.IParsable => (string inputArgument, string outputArgument) => $$"""{{parameterType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}}.TryParse({{inputArgument}}!, CultureInfo.InvariantCulture, out var {{outputArgument}})""", + ParsabilityMethod.IParsable => (string inputArgument, string outputArgument) => $$"""ParsableHelper<{{parameterType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}}>.TryParse({{inputArgument}}!, CultureInfo.InvariantCulture, out var {{outputArgument}})""", ParsabilityMethod.TryParseWithFormatProvider => (string inputArgument, string outputArgument) => $$"""{{parameterType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}}.TryParse({{inputArgument}}!, CultureInfo.InvariantCulture, out var {{outputArgument}})""", ParsabilityMethod.TryParse => (string inputArgument, string outputArgument) => $$"""{{parameterType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}}.TryParse({{inputArgument}}!, out var {{outputArgument}})""", ParsabilityMethod.Enum => (string inputArgument, string outputArgument) => $$"""Enum.TryParse<{{parameterType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat)}}>({{inputArgument}}!, out var {{outputArgument}})""", diff --git a/src/Http/Http.Extensions/src/RequestDelegateFactory.cs b/src/Http/Http.Extensions/src/RequestDelegateFactory.cs index 9afda2e748bc..ec5487854ae0 100644 --- a/src/Http/Http.Extensions/src/RequestDelegateFactory.cs +++ b/src/Http/Http.Extensions/src/RequestDelegateFactory.cs @@ -819,10 +819,10 @@ private static Expression CreateArgument(ParameterInfo parameter, RequestDelegat return BindParameterFromRouteValueOrQueryString(parameter, parameter.Name, factoryContext); } else if (factoryContext.DisableInferredFromBody && ( - (parameter.ParameterType.IsArray && ParameterBindingMethodCache.HasTryParseMethod(parameter.ParameterType.GetElementType()!)) || - parameter.ParameterType == typeof(string[]) || + parameter.ParameterType == typeof(string[]) || parameter.ParameterType == typeof(StringValues) || - parameter.ParameterType == typeof(StringValues?))) + parameter.ParameterType == typeof(StringValues?) || + (parameter.ParameterType.IsArray && ParameterBindingMethodCache.HasTryParseMethod(parameter.ParameterType.GetElementType()!)))) { // We only infer parameter types if you have an array of TryParsables/string[]/StringValues/StringValues?, and DisableInferredFromBody is true diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_Snapshot.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_Snapshot.generated.txt index 26d1d5942c52..f4236e239ebd 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_Snapshot.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_Snapshot.generated.txt @@ -1723,4 +1723,11 @@ namespace Microsoft.AspNetCore.Http.Generated return T.BindAsync(context, parameter); } } + + %GENERATEDCODEATTRIBUTE% + file static class ParsableHelper where T : IParsable + { + public static T Parse(string s, IFormatProvider? provider) => T.Parse(s, provider); + public static bool TryParse(string? s, IFormatProvider? provider, [MaybeNullWhen(returnValue: false)] out T result) => T.TryParse(s, provider, out result); + } } diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitBodyParam_ComplexReturn_Snapshot.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitBodyParam_ComplexReturn_Snapshot.generated.txt index 6b55279be2e7..97474020a91f 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitBodyParam_ComplexReturn_Snapshot.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitBodyParam_ComplexReturn_Snapshot.generated.txt @@ -332,4 +332,11 @@ namespace Microsoft.AspNetCore.Http.Generated return T.BindAsync(context, parameter); } } + + %GENERATEDCODEATTRIBUTE% + file static class ParsableHelper where T : IParsable + { + public static T Parse(string s, IFormatProvider? provider) => T.Parse(s, provider); + public static bool TryParse(string? s, IFormatProvider? provider, [MaybeNullWhen(returnValue: false)] out T result) => T.TryParse(s, provider, out result); + } } diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitServiceParam_SimpleReturn_Snapshot.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitServiceParam_SimpleReturn_Snapshot.generated.txt index e746fcb7b9c5..aabc34afbcbc 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitServiceParam_SimpleReturn_Snapshot.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitServiceParam_SimpleReturn_Snapshot.generated.txt @@ -410,4 +410,11 @@ namespace Microsoft.AspNetCore.Http.Generated return T.BindAsync(context, parameter); } } + + %GENERATEDCODEATTRIBUTE% + file static class ParsableHelper where T : IParsable + { + public static T Parse(string s, IFormatProvider? provider) => T.Parse(s, provider); + public static bool TryParse(string? s, IFormatProvider? provider, [MaybeNullWhen(returnValue: false)] out T result) => T.TryParse(s, provider, out result); + } } diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitSource_SimpleReturn_Snapshot.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitSource_SimpleReturn_Snapshot.generated.txt index e7cbce34da82..1029bbf6f427 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitSource_SimpleReturn_Snapshot.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitSource_SimpleReturn_Snapshot.generated.txt @@ -566,4 +566,11 @@ namespace Microsoft.AspNetCore.Http.Generated return T.BindAsync(context, parameter); } } + + %GENERATEDCODEATTRIBUTE% + file static class ParsableHelper where T : IParsable + { + public static T Parse(string s, IFormatProvider? provider) => T.Parse(s, provider); + public static bool TryParse(string? s, IFormatProvider? provider, [MaybeNullWhen(returnValue: false)] out T result) => T.TryParse(s, provider, out result); + } } diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleSpecialTypeParam_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleSpecialTypeParam_StringReturn.generated.txt index 7dc73e294ebc..7289ed870d0b 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleSpecialTypeParam_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleSpecialTypeParam_StringReturn.generated.txt @@ -256,4 +256,11 @@ namespace Microsoft.AspNetCore.Http.Generated return T.BindAsync(context, parameter); } } + + %GENERATEDCODEATTRIBUTE% + file static class ParsableHelper where T : IParsable + { + public static T Parse(string s, IFormatProvider? provider) => T.Parse(s, provider); + public static bool TryParse(string? s, IFormatProvider? provider, [MaybeNullWhen(returnValue: false)] out T result) => T.TryParse(s, provider, out result); + } } diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleStringParam_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleStringParam_StringReturn.generated.txt index eb12665e119f..2e5991b9f68a 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleStringParam_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleStringParam_StringReturn.generated.txt @@ -284,4 +284,11 @@ namespace Microsoft.AspNetCore.Http.Generated return T.BindAsync(context, parameter); } } + + %GENERATEDCODEATTRIBUTE% + file static class ParsableHelper where T : IParsable + { + public static T Parse(string s, IFormatProvider? provider) => T.Parse(s, provider); + public static bool TryParse(string? s, IFormatProvider? provider, [MaybeNullWhen(returnValue: false)] out T result) => T.TryParse(s, provider, out result); + } } diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_NoParam_StringReturn_WithFilter.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_NoParam_StringReturn_WithFilter.generated.txt index a81bd52385e2..4a1b00e81277 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_NoParam_StringReturn_WithFilter.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_NoParam_StringReturn_WithFilter.generated.txt @@ -250,4 +250,11 @@ namespace Microsoft.AspNetCore.Http.Generated return T.BindAsync(context, parameter); } } + + %GENERATEDCODEATTRIBUTE% + file static class ParsableHelper where T : IParsable + { + public static T Parse(string s, IFormatProvider? provider) => T.Parse(s, provider); + public static bool TryParse(string? s, IFormatProvider? provider, [MaybeNullWhen(returnValue: false)] out T result) => T.TryParse(s, provider, out result); + } } diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleComplexTypeParam_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleComplexTypeParam_StringReturn.generated.txt index 1396cdf01789..4ab22d6c52a0 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleComplexTypeParam_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleComplexTypeParam_StringReturn.generated.txt @@ -276,4 +276,11 @@ namespace Microsoft.AspNetCore.Http.Generated return T.BindAsync(context, parameter); } } + + %GENERATEDCODEATTRIBUTE% + file static class ParsableHelper where T : IParsable + { + public static T Parse(string s, IFormatProvider? provider) => T.Parse(s, provider); + public static bool TryParse(string? s, IFormatProvider? provider, [MaybeNullWhen(returnValue: false)] out T result) => T.TryParse(s, provider, out result); + } } diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleEnumParam_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleEnumParam_StringReturn.generated.txt index b158ab8c65d2..efefcce5bb3d 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleEnumParam_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleEnumParam_StringReturn.generated.txt @@ -276,4 +276,11 @@ namespace Microsoft.AspNetCore.Http.Generated return T.BindAsync(context, parameter); } } + + %GENERATEDCODEATTRIBUTE% + file static class ParsableHelper where T : IParsable + { + public static T Parse(string s, IFormatProvider? provider) => T.Parse(s, provider); + public static bool TryParse(string? s, IFormatProvider? provider, [MaybeNullWhen(returnValue: false)] out T result) => T.TryParse(s, provider, out result); + } } diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleNullableStringParam_WithEmptyQueryStringValueProvided_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleNullableStringParam_WithEmptyQueryStringValueProvided_StringReturn.generated.txt index 16e4f40abd61..2bfa1bb69fa7 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleNullableStringParam_WithEmptyQueryStringValueProvided_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleNullableStringParam_WithEmptyQueryStringValueProvided_StringReturn.generated.txt @@ -260,4 +260,11 @@ namespace Microsoft.AspNetCore.Http.Generated return T.BindAsync(context, parameter); } } + + %GENERATEDCODEATTRIBUTE% + file static class ParsableHelper where T : IParsable + { + public static T Parse(string s, IFormatProvider? provider) => T.Parse(s, provider); + public static bool TryParse(string? s, IFormatProvider? provider, [MaybeNullWhen(returnValue: false)] out T result) => T.TryParse(s, provider, out result); + } } diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleTimeOnlyParam_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleTimeOnlyParam_StringReturn.generated.txt index 28d64a9a57ef..f8e3c65478cd 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleTimeOnlyParam_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleTimeOnlyParam_StringReturn.generated.txt @@ -126,7 +126,7 @@ namespace Microsoft.AspNetCore.Http.Generated wasParamCheckFailure = true; } var p_temp = (string?)p_raw; - if (!global::System.TimeOnly.TryParse(p_temp!, CultureInfo.InvariantCulture, out var p_parsed_temp)) + if (!ParsableHelper.TryParse(p_temp!, CultureInfo.InvariantCulture, out var p_parsed_temp)) { wasParamCheckFailure = true; } @@ -152,7 +152,7 @@ namespace Microsoft.AspNetCore.Http.Generated wasParamCheckFailure = true; } var p_temp = (string?)p_raw; - if (!global::System.TimeOnly.TryParse(p_temp!, CultureInfo.InvariantCulture, out var p_parsed_temp)) + if (!ParsableHelper.TryParse(p_temp!, CultureInfo.InvariantCulture, out var p_parsed_temp)) { wasParamCheckFailure = true; } @@ -276,4 +276,11 @@ namespace Microsoft.AspNetCore.Http.Generated return T.BindAsync(context, parameter); } } + + %GENERATEDCODEATTRIBUTE% + file static class ParsableHelper where T : IParsable + { + public static T Parse(string s, IFormatProvider? provider) => T.Parse(s, provider); + public static bool TryParse(string? s, IFormatProvider? provider, [MaybeNullWhen(returnValue: false)] out T result) => T.TryParse(s, provider, out result); + } } diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_NoParam_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_NoParam_StringReturn.generated.txt index d4582f7849d1..f743969e8826 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_NoParam_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_NoParam_StringReturn.generated.txt @@ -442,4 +442,11 @@ namespace Microsoft.AspNetCore.Http.Generated return T.BindAsync(context, parameter); } } + + %GENERATEDCODEATTRIBUTE% + file static class ParsableHelper where T : IParsable + { + public static T Parse(string s, IFormatProvider? provider) => T.Parse(s, provider); + public static bool TryParse(string? s, IFormatProvider? provider, [MaybeNullWhen(returnValue: false)] out T result) => T.TryParse(s, provider, out result); + } } diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_WithParams_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_WithParams_StringReturn.generated.txt index 3608bfd2f5c5..8bab4f57ece6 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_WithParams_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_WithParams_StringReturn.generated.txt @@ -402,4 +402,11 @@ namespace Microsoft.AspNetCore.Http.Generated return T.BindAsync(context, parameter); } } + + %GENERATEDCODEATTRIBUTE% + file static class ParsableHelper where T : IParsable + { + public static T Parse(string s, IFormatProvider? provider) => T.Parse(s, provider); + public static bool TryParse(string? s, IFormatProvider? provider, [MaybeNullWhen(returnValue: false)] out T result) => T.TryParse(s, provider, out result); + } } diff --git a/src/Mvc/Mvc.ApiExplorer/src/EndpointMetadataApiDescriptionProvider.cs b/src/Mvc/Mvc.ApiExplorer/src/EndpointMetadataApiDescriptionProvider.cs index 6f4d479e51ad..8695097020fd 100644 --- a/src/Mvc/Mvc.ApiExplorer/src/EndpointMetadataApiDescriptionProvider.cs +++ b/src/Mvc/Mvc.ApiExplorer/src/EndpointMetadataApiDescriptionProvider.cs @@ -307,9 +307,9 @@ private static ParameterDescriptor CreateParameterDescriptor(ParameterInfo param return (BindingSource.FormFile, parameter.Name ?? string.Empty, false, parameter.ParameterType); } else if (disableInferredBody && ( - (parameter.ParameterType.IsArray && ParameterBindingMethodCache.HasTryParseMethod(parameter.ParameterType.GetElementType()!)) || parameter.ParameterType == typeof(string[]) || - parameter.ParameterType == typeof(StringValues))) + parameter.ParameterType == typeof(StringValues) || + (parameter.ParameterType.IsArray && ParameterBindingMethodCache.HasTryParseMethod(parameter.ParameterType.GetElementType()!)) )) { return (BindingSource.Query, parameter.Name ?? string.Empty, false, parameter.ParameterType); } diff --git a/src/OpenApi/src/OpenApiGenerator.cs b/src/OpenApi/src/OpenApiGenerator.cs index f9039d6282ed..9a874fd2663d 100644 --- a/src/OpenApi/src/OpenApiGenerator.cs +++ b/src/OpenApi/src/OpenApiGenerator.cs @@ -447,9 +447,9 @@ private List GetOpenApiParameters(MethodInfo methodInfo, Route return (true, null, null); } else if (disableInferredBody && ( - (parameter.ParameterType.IsArray && ParameterBindingMethodCache.HasTryParseMethod(parameter.ParameterType.GetElementType()!)) || parameter.ParameterType == typeof(string[]) || - parameter.ParameterType == typeof(StringValues))) + parameter.ParameterType == typeof(StringValues) || + (parameter.ParameterType.IsArray && ParameterBindingMethodCache.HasTryParseMethod(parameter.ParameterType.GetElementType()!)))) { return (false, ParameterLocation.Query, null); }