diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelFactoryProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelFactoryProvider.cs index a61da49e42b..47caab2127b 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelFactoryProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelFactoryProvider.cs @@ -459,6 +459,13 @@ private static IReadOnlyList GetParameters( continue; } + // Skip parameters for properties that were customized via CodeGenMember to be non-public + if (param.Property?.OriginalName != null + && !param.Property!.Modifiers.HasFlag(MethodSignatureModifiers.Public)) + { + continue; + } + parameters.Add(GetModelFactoryParam(param)); } return [.. parameters]; diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelFactories/ModelFactoryProviderTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelFactories/ModelFactoryProviderTests.cs index 52e0ffb88a8..e254a18a583 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelFactories/ModelFactoryProviderTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelFactories/ModelFactoryProviderTests.cs @@ -466,6 +466,36 @@ public void RequiredConstantPropertiesAreNotExposedAsParameters() Assert.AreEqual("return new global::Sample.Models.MockInputModel(\"constant\", prop2, additionalBinaryDataProperties: null);\n", factoryMethod.BodyStatements!.ToDisplayString()); } + [Test] + public async Task SkipsCodeGenMemberInternalProperty() + { + var inputModel = InputFactory.Model( + "mockInputModel", + properties: + [ + InputFactory.Property("prop1", InputPrimitiveType.String), + InputFactory.Property("prop2", InputPrimitiveType.String) + ]); + + var mockGenerator = await MockHelpers.LoadMockGeneratorAsync( + inputModelTypes: [inputModel], + compilation: async () => await Helpers.GetCompilationFromDirectoryAsync()); + + var modelFactoryProvider = mockGenerator.Object.OutputLibrary.TypeProviders.OfType().SingleOrDefault(); + Assert.IsNotNull(modelFactoryProvider); + + var factoryMethod = modelFactoryProvider!.Methods.FirstOrDefault(m => m.Signature.Name == "MockInputModel"); + Assert.IsNotNull(factoryMethod); + + // prop1 is customized via CodeGenMember to be internal, so it should not appear in the factory method + Assert.AreEqual(1, factoryMethod!.Signature.Parameters.Count); + Assert.AreEqual("prop2", factoryMethod.Signature.Parameters[0].Name); + + // The body should pass default for the internal property + var body = factoryMethod.BodyStatements!.ToDisplayString(); + StringAssert.Contains("default", body); + } + private static InputModelType[] GetTestModels() { InputType additionalPropertiesUnknown = InputPrimitiveType.Any; diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelFactories/TestData/ModelFactoryProviderTests/SkipsCodeGenMemberInternalProperty/MockInputModel.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelFactories/TestData/ModelFactoryProviderTests/SkipsCodeGenMemberInternalProperty/MockInputModel.cs new file mode 100644 index 00000000000..caa2352d91a --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelFactories/TestData/ModelFactoryProviderTests/SkipsCodeGenMemberInternalProperty/MockInputModel.cs @@ -0,0 +1,12 @@ +#nullable disable + +using Microsoft.TypeSpec.Generator.Customizations; + +namespace Sample.Models +{ + public partial class MockInputModel + { + [CodeGenMember("Prop1")] + internal string Prop1Internal { get; set; } + } +}