diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs index 9b8fb7433dc..dfbc4a42423 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs @@ -278,7 +278,21 @@ private IEnumerable GetStackVariablesForProtocolParamConver private List GetSpreadConversion(TypeProvider spreadSource) { - var convenienceMethodParams = ConvenienceMethodParameters.ToDictionary(p => p.Name); + // Match convenience method parameters to constructor parameters by wire (serialized) name + // to handle cases where C# names diverge due to @clientName renames, @encodedName, + // or casing differences between the convenience parameters and model properties. + // Falls back to C# name matching for parameters without wire information. + var convenienceMethodParamsByWireName = new Dictionary(StringComparer.OrdinalIgnoreCase); + var convenienceMethodParamsByName = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var p in ConvenienceMethodParameters) + { + if (p.WireInfo?.SerializedName != null) + { + convenienceMethodParamsByWireName.TryAdd(p.WireInfo.SerializedName, p); + } + convenienceMethodParamsByName.TryAdd(p.Name, p); + } + List expressions = new(spreadSource.Properties.Count); // we should make this find more deterministic var ctor = spreadSource.CanonicalView.Constructors.First(c => @@ -287,7 +301,13 @@ private List GetSpreadConversion(TypeProvider spreadSource) foreach (var param in ctor.Signature.Parameters) { - if (convenienceMethodParams.TryGetValue(param.Name, out var convenienceParam)) + var wireName = param.Property?.WireInfo?.SerializedName; + if (!(wireName != null && convenienceMethodParamsByWireName.TryGetValue(wireName, out var convenienceParam))) + { + convenienceMethodParamsByName.TryGetValue(param.Name, out convenienceParam); + } + + if (convenienceParam != null) { if (convenienceParam.Type.IsList) { diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs index 78cb15103f5..69abeb54bd5 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs @@ -719,7 +719,7 @@ public virtual ClientResult AnonymousBody(string name, BinaryData require Argument.AssertNotNullOrEmpty(propertyWithSpecialDocs, nameof(propertyWithSpecialDocs)); Thing spreadModel = new Thing( - default, + name, requiredUnion, "accept", requiredNullableString, @@ -770,7 +770,7 @@ public virtual async Task> AnonymousBodyAsync(string name, B Argument.AssertNotNullOrEmpty(propertyWithSpecialDocs, nameof(propertyWithSpecialDocs)); Thing spreadModel = new Thing( - default, + name, requiredUnion, "accept", requiredNullableString,