{"record":{"id":"10c5b1e9f68ec04c","repo":"dotnet/machinelearning","slug":"did-not-find-access-modifier-parameter-construct","errorCode":null,"errorMessage":"Did not find access modifier (Parameter 'constructorInfo')","messagePattern":"Did not find access modifier \\(Parameter 'constructorInfo'\\)","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.ML.Core/ComponentModel/ComponentCatalog.cs","lineNumber":50,"sourceCode":"            return AccessModifier.Public;\n        throw new ArgumentException(\"Did not find access modifier\", nameof(methodInfo));\n    }\n\n    internal static AccessModifier Accessmodifier(this ConstructorInfo constructorInfo)\n    {\n        if (constructorInfo.IsFamilyAndAssembly)\n            return AccessModifier.PrivateProtected;\n        if (constructorInfo.IsPrivate)\n            return AccessModifier.Private;\n        if (constructorInfo.IsFamily)\n            return AccessModifier.Protected;\n        if (constructorInfo.IsFamilyOrAssembly)\n            return AccessModifier.ProtectedInternal;\n        if (constructorInfo.IsAssembly)\n            return AccessModifier.Internal;\n        if (constructorInfo.IsPublic)\n            return AccessModifier.Public;\n        throw new ArgumentException(\"Did not find access modifier\", nameof(constructorInfo));\n    }\n\n    internal enum AccessModifier\n    {\n        PrivateProtected,\n        Private,\n        Protected,\n        ProtectedInternal,\n        Internal,\n        Public\n    }\n}\n\n/// <summary>\n/// This catalogs instantiable components (aka, loadable classes). Components are registered via\n/// a descendant of <see cref=\"LoadableClassAttributeBase\"/>, identifying the names and signature types under which the component\n/// type should be registered. Signatures are delegate types that return void and specify that parameter\n/// types for component instantiation. Each component may also specify an \"arguments object\" that should","sourceCodeStart":32,"sourceCodeEnd":68,"githubUrl":"https://github.com/dotnet/machinelearning/blob/7b76e69cf964daeca3f1377af6bc5543284d56c6/src/Microsoft.ML.Core/ComponentModel/ComponentCatalog.cs#L32-L68","documentation":"The Accessmodifier extension on ConstructorInfo mirrors the MethodInfo version: it classifies constructor visibility into the AccessModifier enum and throws ArgumentException('Did not find access modifier', nameof(constructorInfo)) if no visibility flag matches. ComponentCatalog invokes it when enumerating registrable constructors.","triggerScenarios":"ComponentCatalog enumerating constructors of a registered type and encountering a ConstructorInfo with none of the standard visibility flags — typically only from dynamically emitted constructors or non-standard compiler output.","commonSituations":"Registering types from Reflection.Emit-generated assemblies; duplicate/corrupted assembly versions where the reflected constructor metadata is malformed.","solutions":["Only register statically compiled, normal CLR types with ComponentCatalog.","Check the target constructor's visibility flags via reflection before registration and skip non-standard ones.","Catch ArgumentException during registration and log/skip the offending type.","Rebuild the component assembly if its metadata appears corrupted."],"exampleFix":"// before\ncatalog.RegisterComponent(typeof(DynamicProxy));\n// after\nvar ctors = typeof(DynamicProxy).GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);\nif (ctors.All(c => c.IsPublic || c.IsPrivate || c.IsFamily || c.IsAssembly || c.IsFamilyOrAssembly))\n    catalog.RegisterComponent(typeof(DynamicProxy));","handlingStrategy":"validation","validationCode":"var c = typeof(MyComponent).GetConstructor(new[]{ typeof(MLContext) });\nbool classifiable = c.IsPublic || c.IsPrivate || c.IsFamily ||\n    c.IsAssembly || c.IsFamilyOrAssembly || c.IsFamilyAndAssembly;\nif (!classifiable) throw new InvalidOperationException(\"Constructor visibility non-standard\");","typeGuard":"static bool HasStandardCtorVisibility(ConstructorInfo c) =>\n    c.IsPublic || c.IsPrivate || c.IsFamily ||\n    c.IsAssembly || c.IsFamilyOrAssembly || c.IsFamilyAndAssembly;","tryCatchPattern":"try\n{\n    catalog.RegisterComponent(type);\n}\ncatch (ArgumentException ex) when (ex.ParamName == \"constructorInfo\")\n{\n    logger.LogWarning($\"Skipped {type}: non-standard constructor visibility\");\n}","preventionTips":["Use ordinary public or internal constructors on registered component types.","Avoid registering dynamically emitted types.","Pre-screen constructors with the visibility-flag check before registration.","Rebuild assemblies if reflection metadata looks inconsistent."],"tags":["reflection","mlnet","component-catalog","constructor"],"backgroundTag":"internal-invariant-violation","analyzedSha":"7b76e69cf964daeca3f1377af6bc5543284d56c6","analyzedAt":"2026-09-11T12:35:38.930Z","contentChangedAt":"2026-09-11T12:35:38.930Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}