Add ConfigurationIgnoreAttribute - #126396

Merged
rosebyte merged 8 commits into
dotnet:mainfrom
rosebyte:feature/configuration-ignore-attribute
Apr 14, 2026
Merged

Add ConfigurationIgnoreAttribute#126396
rosebyte merged 8 commits into
dotnet:mainfrom
rosebyte:feature/configuration-ignore-attribute

Conversation

@rosebyte

Copy link
Copy Markdown
Member

Fixes#125111

Add ConfigurationIgnoreAttribute so configuration binding can explicitly skip selected properties.

Changes

  • Added ConfigurationIgnoreAttribute to Microsoft.Extensions.Configuration.Abstractions (implementation + ref).
  • Reflection binder now skips ignored properties.
  • Constructor-parameter/property matching now treats ignored properties as non-bindable.
  • Source generator updated to parse and honor ignored properties.
  • Added tests for ignore behavior, ErrorOnUnknownConfiguration, and constructor matching with ignored properties.
  • Updated Abstractions README/PACKAGE examples.

Validation

  • dotnet build for Abstractions and Binder.
  • Binder unit tests: 296 passed, 0 failed.
  • Source-generation tests: 347 total, 0 failed (28 skipped by conditions).

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-extensions-configuration
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new ConfigurationIgnoreAttribute to the configuration abstractions and updates both the reflection-based binder and the source generator so selected properties can be explicitly excluded from binding.

Changes:

  • Introduces ConfigurationIgnoreAttribute in Microsoft.Extensions.Configuration.Abstractions (impl + ref surface).
  • Updates reflection binder and source generator to skip ignored properties during binding and constructor-parameter matching.
  • Adds/extends tests and updates package documentation examples to cover ignore behavior and ErrorOnUnknownConfiguration.

Reviewed changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.TestClasses.csAdds a primary-ctor test type with an ignored property to validate ctor/property matching behavior.
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.Helpers.csExtends ComplexOptions with an ignored property for binder test coverage.
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.csAdds tests asserting ignored properties aren’t bound and don’t trip ErrorOnUnknownConfiguration, plus ctor-matching behavior.
src/libraries/Microsoft.Extensions.Configuration.Binder/src/ConfigurationBinder.csSkips ignored properties in reflection binding and in ctor-parameter/property equivalence checks; adds IsIgnoredProperty.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Specs/TypeIndex.csEnsures generator considers property.IsIgnored when deciding if a property is bindable.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Specs/Members/PropertySpec.csAdds IsIgnored flag to property spec model used by the generator.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Parser/KnownTypeSymbols.csAdds symbol lookup for ConfigurationIgnoreAttribute for generator parsing.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/ConfigurationBindingGenerator.Parser.csParses [ConfigurationIgnore] and attempts to incorporate it into property/ctor matching.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/PACKAGE.mdUpdates package example to mention/use [ConfigurationIgnore].
src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationIgnoreAttribute.csAdds the new public attribute type.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/ref/Microsoft.Extensions.Configuration.Abstractions.csAdds the attribute to the reference assembly surface area.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/README.mdUpdates README example to mention/use [ConfigurationIgnore].

@cincuranetcincuranet changed the title Add COnfigurationIgnoreAttributeAdd ConfigurationIgnoreAttributeApr 2, 2026
CopilotAI review requested due to automatic review settings April 9, 2026 11:37

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

Comments suppressed due to low confidence (1)

src/libraries/Microsoft.Extensions.Configuration.Binder/src/ConfigurationBinder.cs:256

  • The constructor-parameter/property check is case-sensitive (p.Name == property.Name), but constructor parameter ↔ property equivalence is treated case-insensitively elsewhere (e.g., DoAllParametersHaveEquivalentProperties uses OrdinalIgnoreCase). This can cause properties whose names differ only by casing (common with primary ctors like "color" → "Color") to be bound again instead of going through the ctor-parameter path. Consider using an OrdinalIgnoreCase comparison here for consistency and to avoid unintended extra binding/setter side-effects.

if (constructorParameters is null || !constructorParameters.Any(p => p.Name == property.Name))
{
BindProperty(property, instance, configuration, options);
}

@rosebyte
rosebyteforce-pushed the feature/configuration-ignore-attribute branch from bf00b83 to bac2378CompareApril 9, 2026 13:24
CopilotAI review requested due to automatic review settings April 9, 2026 13:28

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

CopilotAI review requested due to automatic review settings April 9, 2026 16:50
@rosebyte
rosebyte marked this pull request as ready for review April 9, 2026 16:51

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

@tarekghtarekgh left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

CopilotAI review requested due to automatic review settings April 13, 2026 07:30

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

@rosebyte
rosebyte merged commit ebf02b3 into dotnet:mainApr 14, 2026
98 of 100 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 15, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: Add ConfigurationIgnoreAttribute to exclude properties from configuration binding

4 participants

@rosebyte@cincuranet@tarekgh
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add ConfigurationIgnoreAttribute - #126396

Merged
rosebyte merged 8 commits into
dotnet:mainfrom
rosebyte:feature/configuration-ignore-attribute
Apr 14, 2026
Merged

Add ConfigurationIgnoreAttribute#126396
rosebyte merged 8 commits into
dotnet:mainfrom
rosebyte:feature/configuration-ignore-attribute

Conversation

@rosebyte

Copy link
Copy Markdown
Member

Fixes#125111

Add ConfigurationIgnoreAttribute so configuration binding can explicitly skip selected properties.

Changes

  • Added ConfigurationIgnoreAttribute to Microsoft.Extensions.Configuration.Abstractions (implementation + ref).
  • Reflection binder now skips ignored properties.
  • Constructor-parameter/property matching now treats ignored properties as non-bindable.
  • Source generator updated to parse and honor ignored properties.
  • Added tests for ignore behavior, ErrorOnUnknownConfiguration, and constructor matching with ignored properties.
  • Updated Abstractions README/PACKAGE examples.

Validation

  • dotnet build for Abstractions and Binder.
  • Binder unit tests: 296 passed, 0 failed.
  • Source-generation tests: 347 total, 0 failed (28 skipped by conditions).

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-extensions-configuration
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new ConfigurationIgnoreAttribute to the configuration abstractions and updates both the reflection-based binder and the source generator so selected properties can be explicitly excluded from binding.

Changes:

  • Introduces ConfigurationIgnoreAttribute in Microsoft.Extensions.Configuration.Abstractions (impl + ref surface).
  • Updates reflection binder and source generator to skip ignored properties during binding and constructor-parameter matching.
  • Adds/extends tests and updates package documentation examples to cover ignore behavior and ErrorOnUnknownConfiguration.

Reviewed changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.TestClasses.csAdds a primary-ctor test type with an ignored property to validate ctor/property matching behavior.
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.Helpers.csExtends ComplexOptions with an ignored property for binder test coverage.
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.csAdds tests asserting ignored properties aren’t bound and don’t trip ErrorOnUnknownConfiguration, plus ctor-matching behavior.
src/libraries/Microsoft.Extensions.Configuration.Binder/src/ConfigurationBinder.csSkips ignored properties in reflection binding and in ctor-parameter/property equivalence checks; adds IsIgnoredProperty.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Specs/TypeIndex.csEnsures generator considers property.IsIgnored when deciding if a property is bindable.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Specs/Members/PropertySpec.csAdds IsIgnored flag to property spec model used by the generator.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Parser/KnownTypeSymbols.csAdds symbol lookup for ConfigurationIgnoreAttribute for generator parsing.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/ConfigurationBindingGenerator.Parser.csParses [ConfigurationIgnore] and attempts to incorporate it into property/ctor matching.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/PACKAGE.mdUpdates package example to mention/use [ConfigurationIgnore].
src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationIgnoreAttribute.csAdds the new public attribute type.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/ref/Microsoft.Extensions.Configuration.Abstractions.csAdds the attribute to the reference assembly surface area.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/README.mdUpdates README example to mention/use [ConfigurationIgnore].

@cincuranetcincuranet changed the title Add COnfigurationIgnoreAttributeAdd ConfigurationIgnoreAttributeApr 2, 2026
CopilotAI review requested due to automatic review settings April 9, 2026 11:37

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

Comments suppressed due to low confidence (1)

src/libraries/Microsoft.Extensions.Configuration.Binder/src/ConfigurationBinder.cs:256

  • The constructor-parameter/property check is case-sensitive (p.Name == property.Name), but constructor parameter ↔ property equivalence is treated case-insensitively elsewhere (e.g., DoAllParametersHaveEquivalentProperties uses OrdinalIgnoreCase). This can cause properties whose names differ only by casing (common with primary ctors like "color" → "Color") to be bound again instead of going through the ctor-parameter path. Consider using an OrdinalIgnoreCase comparison here for consistency and to avoid unintended extra binding/setter side-effects.

if (constructorParameters is null || !constructorParameters.Any(p => p.Name == property.Name))
{
BindProperty(property, instance, configuration, options);
}

@rosebyte
rosebyteforce-pushed the feature/configuration-ignore-attribute branch from bf00b83 to bac2378CompareApril 9, 2026 13:24
CopilotAI review requested due to automatic review settings April 9, 2026 13:28

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

CopilotAI review requested due to automatic review settings April 9, 2026 16:50
@rosebyte
rosebyte marked this pull request as ready for review April 9, 2026 16:51

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

@tarekghtarekgh left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

CopilotAI review requested due to automatic review settings April 13, 2026 07:30

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

@rosebyte
rosebyte merged commit ebf02b3 into dotnet:mainApr 14, 2026
98 of 100 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 15, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: Add ConfigurationIgnoreAttribute to exclude properties from configuration binding

4 participants

@rosebyte@cincuranet@tarekgh
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add ConfigurationIgnoreAttribute - #126396

Merged
rosebyte merged 8 commits into
dotnet:mainfrom
rosebyte:feature/configuration-ignore-attribute
Apr 14, 2026
Merged

Add ConfigurationIgnoreAttribute#126396
rosebyte merged 8 commits into
dotnet:mainfrom
rosebyte:feature/configuration-ignore-attribute

Conversation

@rosebyte

Copy link
Copy Markdown
Member

Fixes#125111

Add ConfigurationIgnoreAttribute so configuration binding can explicitly skip selected properties.

Changes

  • Added ConfigurationIgnoreAttribute to Microsoft.Extensions.Configuration.Abstractions (implementation + ref).
  • Reflection binder now skips ignored properties.
  • Constructor-parameter/property matching now treats ignored properties as non-bindable.
  • Source generator updated to parse and honor ignored properties.
  • Added tests for ignore behavior, ErrorOnUnknownConfiguration, and constructor matching with ignored properties.
  • Updated Abstractions README/PACKAGE examples.

Validation

  • dotnet build for Abstractions and Binder.
  • Binder unit tests: 296 passed, 0 failed.
  • Source-generation tests: 347 total, 0 failed (28 skipped by conditions).

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-extensions-configuration
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new ConfigurationIgnoreAttribute to the configuration abstractions and updates both the reflection-based binder and the source generator so selected properties can be explicitly excluded from binding.

Changes:

  • Introduces ConfigurationIgnoreAttribute in Microsoft.Extensions.Configuration.Abstractions (impl + ref surface).
  • Updates reflection binder and source generator to skip ignored properties during binding and constructor-parameter matching.
  • Adds/extends tests and updates package documentation examples to cover ignore behavior and ErrorOnUnknownConfiguration.

Reviewed changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.TestClasses.csAdds a primary-ctor test type with an ignored property to validate ctor/property matching behavior.
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.Helpers.csExtends ComplexOptions with an ignored property for binder test coverage.
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.csAdds tests asserting ignored properties aren’t bound and don’t trip ErrorOnUnknownConfiguration, plus ctor-matching behavior.
src/libraries/Microsoft.Extensions.Configuration.Binder/src/ConfigurationBinder.csSkips ignored properties in reflection binding and in ctor-parameter/property equivalence checks; adds IsIgnoredProperty.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Specs/TypeIndex.csEnsures generator considers property.IsIgnored when deciding if a property is bindable.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Specs/Members/PropertySpec.csAdds IsIgnored flag to property spec model used by the generator.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Parser/KnownTypeSymbols.csAdds symbol lookup for ConfigurationIgnoreAttribute for generator parsing.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/ConfigurationBindingGenerator.Parser.csParses [ConfigurationIgnore] and attempts to incorporate it into property/ctor matching.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/PACKAGE.mdUpdates package example to mention/use [ConfigurationIgnore].
src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationIgnoreAttribute.csAdds the new public attribute type.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/ref/Microsoft.Extensions.Configuration.Abstractions.csAdds the attribute to the reference assembly surface area.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/README.mdUpdates README example to mention/use [ConfigurationIgnore].

@cincuranetcincuranet changed the title Add COnfigurationIgnoreAttributeAdd ConfigurationIgnoreAttributeApr 2, 2026
CopilotAI review requested due to automatic review settings April 9, 2026 11:37

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

Comments suppressed due to low confidence (1)

src/libraries/Microsoft.Extensions.Configuration.Binder/src/ConfigurationBinder.cs:256

  • The constructor-parameter/property check is case-sensitive (p.Name == property.Name), but constructor parameter ↔ property equivalence is treated case-insensitively elsewhere (e.g., DoAllParametersHaveEquivalentProperties uses OrdinalIgnoreCase). This can cause properties whose names differ only by casing (common with primary ctors like "color" → "Color") to be bound again instead of going through the ctor-parameter path. Consider using an OrdinalIgnoreCase comparison here for consistency and to avoid unintended extra binding/setter side-effects.

if (constructorParameters is null || !constructorParameters.Any(p => p.Name == property.Name))
{
BindProperty(property, instance, configuration, options);
}

@rosebyte
rosebyteforce-pushed the feature/configuration-ignore-attribute branch from bf00b83 to bac2378CompareApril 9, 2026 13:24
CopilotAI review requested due to automatic review settings April 9, 2026 13:28

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

CopilotAI review requested due to automatic review settings April 9, 2026 16:50
@rosebyte
rosebyte marked this pull request as ready for review April 9, 2026 16:51

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

@tarekghtarekgh left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

CopilotAI review requested due to automatic review settings April 13, 2026 07:30

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

@rosebyte
rosebyte merged commit ebf02b3 into dotnet:mainApr 14, 2026
98 of 100 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 15, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: Add ConfigurationIgnoreAttribute to exclude properties from configuration binding

4 participants

@rosebyte@cincuranet@tarekgh
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add ConfigurationIgnoreAttribute - #126396

Merged
rosebyte merged 8 commits into
dotnet:mainfrom
rosebyte:feature/configuration-ignore-attribute
Apr 14, 2026
Merged

Add ConfigurationIgnoreAttribute#126396
rosebyte merged 8 commits into
dotnet:mainfrom
rosebyte:feature/configuration-ignore-attribute

Conversation

@rosebyte

Copy link
Copy Markdown
Member

Fixes#125111

Add ConfigurationIgnoreAttribute so configuration binding can explicitly skip selected properties.

Changes

  • Added ConfigurationIgnoreAttribute to Microsoft.Extensions.Configuration.Abstractions (implementation + ref).
  • Reflection binder now skips ignored properties.
  • Constructor-parameter/property matching now treats ignored properties as non-bindable.
  • Source generator updated to parse and honor ignored properties.
  • Added tests for ignore behavior, ErrorOnUnknownConfiguration, and constructor matching with ignored properties.
  • Updated Abstractions README/PACKAGE examples.

Validation

  • dotnet build for Abstractions and Binder.
  • Binder unit tests: 296 passed, 0 failed.
  • Source-generation tests: 347 total, 0 failed (28 skipped by conditions).

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-extensions-configuration
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new ConfigurationIgnoreAttribute to the configuration abstractions and updates both the reflection-based binder and the source generator so selected properties can be explicitly excluded from binding.

Changes:

  • Introduces ConfigurationIgnoreAttribute in Microsoft.Extensions.Configuration.Abstractions (impl + ref surface).
  • Updates reflection binder and source generator to skip ignored properties during binding and constructor-parameter matching.
  • Adds/extends tests and updates package documentation examples to cover ignore behavior and ErrorOnUnknownConfiguration.

Reviewed changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.TestClasses.csAdds a primary-ctor test type with an ignored property to validate ctor/property matching behavior.
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.Helpers.csExtends ComplexOptions with an ignored property for binder test coverage.
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.csAdds tests asserting ignored properties aren’t bound and don’t trip ErrorOnUnknownConfiguration, plus ctor-matching behavior.
src/libraries/Microsoft.Extensions.Configuration.Binder/src/ConfigurationBinder.csSkips ignored properties in reflection binding and in ctor-parameter/property equivalence checks; adds IsIgnoredProperty.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Specs/TypeIndex.csEnsures generator considers property.IsIgnored when deciding if a property is bindable.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Specs/Members/PropertySpec.csAdds IsIgnored flag to property spec model used by the generator.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Parser/KnownTypeSymbols.csAdds symbol lookup for ConfigurationIgnoreAttribute for generator parsing.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/ConfigurationBindingGenerator.Parser.csParses [ConfigurationIgnore] and attempts to incorporate it into property/ctor matching.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/PACKAGE.mdUpdates package example to mention/use [ConfigurationIgnore].
src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationIgnoreAttribute.csAdds the new public attribute type.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/ref/Microsoft.Extensions.Configuration.Abstractions.csAdds the attribute to the reference assembly surface area.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/README.mdUpdates README example to mention/use [ConfigurationIgnore].

@cincuranetcincuranet changed the title Add COnfigurationIgnoreAttributeAdd ConfigurationIgnoreAttributeApr 2, 2026
CopilotAI review requested due to automatic review settings April 9, 2026 11:37

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

Comments suppressed due to low confidence (1)

src/libraries/Microsoft.Extensions.Configuration.Binder/src/ConfigurationBinder.cs:256

  • The constructor-parameter/property check is case-sensitive (p.Name == property.Name), but constructor parameter ↔ property equivalence is treated case-insensitively elsewhere (e.g., DoAllParametersHaveEquivalentProperties uses OrdinalIgnoreCase). This can cause properties whose names differ only by casing (common with primary ctors like "color" → "Color") to be bound again instead of going through the ctor-parameter path. Consider using an OrdinalIgnoreCase comparison here for consistency and to avoid unintended extra binding/setter side-effects.

if (constructorParameters is null || !constructorParameters.Any(p => p.Name == property.Name))
{
BindProperty(property, instance, configuration, options);
}

@rosebyte
rosebyteforce-pushed the feature/configuration-ignore-attribute branch from bf00b83 to bac2378CompareApril 9, 2026 13:24
CopilotAI review requested due to automatic review settings April 9, 2026 13:28

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

CopilotAI review requested due to automatic review settings April 9, 2026 16:50
@rosebyte
rosebyte marked this pull request as ready for review April 9, 2026 16:51

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

@tarekghtarekgh left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

CopilotAI review requested due to automatic review settings April 13, 2026 07:30

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

@rosebyte
rosebyte merged commit ebf02b3 into dotnet:mainApr 14, 2026
98 of 100 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 15, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: Add ConfigurationIgnoreAttribute to exclude properties from configuration binding

4 participants

@rosebyte@cincuranet@tarekgh
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add ConfigurationIgnoreAttribute - #126396

Merged
rosebyte merged 8 commits into
dotnet:mainfrom
rosebyte:feature/configuration-ignore-attribute
Apr 14, 2026
Merged

Add ConfigurationIgnoreAttribute#126396
rosebyte merged 8 commits into
dotnet:mainfrom
rosebyte:feature/configuration-ignore-attribute

Conversation

@rosebyte

Copy link
Copy Markdown
Member

Fixes#125111

Add ConfigurationIgnoreAttribute so configuration binding can explicitly skip selected properties.

Changes

  • Added ConfigurationIgnoreAttribute to Microsoft.Extensions.Configuration.Abstractions (implementation + ref).
  • Reflection binder now skips ignored properties.
  • Constructor-parameter/property matching now treats ignored properties as non-bindable.
  • Source generator updated to parse and honor ignored properties.
  • Added tests for ignore behavior, ErrorOnUnknownConfiguration, and constructor matching with ignored properties.
  • Updated Abstractions README/PACKAGE examples.

Validation

  • dotnet build for Abstractions and Binder.
  • Binder unit tests: 296 passed, 0 failed.
  • Source-generation tests: 347 total, 0 failed (28 skipped by conditions).

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-extensions-configuration
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new ConfigurationIgnoreAttribute to the configuration abstractions and updates both the reflection-based binder and the source generator so selected properties can be explicitly excluded from binding.

Changes:

  • Introduces ConfigurationIgnoreAttribute in Microsoft.Extensions.Configuration.Abstractions (impl + ref surface).
  • Updates reflection binder and source generator to skip ignored properties during binding and constructor-parameter matching.
  • Adds/extends tests and updates package documentation examples to cover ignore behavior and ErrorOnUnknownConfiguration.

Reviewed changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.TestClasses.csAdds a primary-ctor test type with an ignored property to validate ctor/property matching behavior.
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.Helpers.csExtends ComplexOptions with an ignored property for binder test coverage.
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.csAdds tests asserting ignored properties aren’t bound and don’t trip ErrorOnUnknownConfiguration, plus ctor-matching behavior.
src/libraries/Microsoft.Extensions.Configuration.Binder/src/ConfigurationBinder.csSkips ignored properties in reflection binding and in ctor-parameter/property equivalence checks; adds IsIgnoredProperty.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Specs/TypeIndex.csEnsures generator considers property.IsIgnored when deciding if a property is bindable.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Specs/Members/PropertySpec.csAdds IsIgnored flag to property spec model used by the generator.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Parser/KnownTypeSymbols.csAdds symbol lookup for ConfigurationIgnoreAttribute for generator parsing.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/ConfigurationBindingGenerator.Parser.csParses [ConfigurationIgnore] and attempts to incorporate it into property/ctor matching.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/PACKAGE.mdUpdates package example to mention/use [ConfigurationIgnore].
src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationIgnoreAttribute.csAdds the new public attribute type.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/ref/Microsoft.Extensions.Configuration.Abstractions.csAdds the attribute to the reference assembly surface area.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/README.mdUpdates README example to mention/use [ConfigurationIgnore].

@cincuranetcincuranet changed the title Add COnfigurationIgnoreAttributeAdd ConfigurationIgnoreAttributeApr 2, 2026
CopilotAI review requested due to automatic review settings April 9, 2026 11:37

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

Comments suppressed due to low confidence (1)

src/libraries/Microsoft.Extensions.Configuration.Binder/src/ConfigurationBinder.cs:256

  • The constructor-parameter/property check is case-sensitive (p.Name == property.Name), but constructor parameter ↔ property equivalence is treated case-insensitively elsewhere (e.g., DoAllParametersHaveEquivalentProperties uses OrdinalIgnoreCase). This can cause properties whose names differ only by casing (common with primary ctors like "color" → "Color") to be bound again instead of going through the ctor-parameter path. Consider using an OrdinalIgnoreCase comparison here for consistency and to avoid unintended extra binding/setter side-effects.

if (constructorParameters is null || !constructorParameters.Any(p => p.Name == property.Name))
{
BindProperty(property, instance, configuration, options);
}

@rosebyte
rosebyteforce-pushed the feature/configuration-ignore-attribute branch from bf00b83 to bac2378CompareApril 9, 2026 13:24
CopilotAI review requested due to automatic review settings April 9, 2026 13:28

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

CopilotAI review requested due to automatic review settings April 9, 2026 16:50
@rosebyte
rosebyte marked this pull request as ready for review April 9, 2026 16:51

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

@tarekghtarekgh left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

CopilotAI review requested due to automatic review settings April 13, 2026 07:30

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

@rosebyte
rosebyte merged commit ebf02b3 into dotnet:mainApr 14, 2026
98 of 100 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 15, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: Add ConfigurationIgnoreAttribute to exclude properties from configuration binding

4 participants

@rosebyte@cincuranet@tarekgh
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add ConfigurationIgnoreAttribute - #126396

Merged
rosebyte merged 8 commits into
dotnet:mainfrom
rosebyte:feature/configuration-ignore-attribute
Apr 14, 2026
Merged

Add ConfigurationIgnoreAttribute#126396
rosebyte merged 8 commits into
dotnet:mainfrom
rosebyte:feature/configuration-ignore-attribute

Conversation

@rosebyte

Copy link
Copy Markdown
Member

Fixes#125111

Add ConfigurationIgnoreAttribute so configuration binding can explicitly skip selected properties.

Changes

  • Added ConfigurationIgnoreAttribute to Microsoft.Extensions.Configuration.Abstractions (implementation + ref).
  • Reflection binder now skips ignored properties.
  • Constructor-parameter/property matching now treats ignored properties as non-bindable.
  • Source generator updated to parse and honor ignored properties.
  • Added tests for ignore behavior, ErrorOnUnknownConfiguration, and constructor matching with ignored properties.
  • Updated Abstractions README/PACKAGE examples.

Validation

  • dotnet build for Abstractions and Binder.
  • Binder unit tests: 296 passed, 0 failed.
  • Source-generation tests: 347 total, 0 failed (28 skipped by conditions).

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-extensions-configuration
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new ConfigurationIgnoreAttribute to the configuration abstractions and updates both the reflection-based binder and the source generator so selected properties can be explicitly excluded from binding.

Changes:

  • Introduces ConfigurationIgnoreAttribute in Microsoft.Extensions.Configuration.Abstractions (impl + ref surface).
  • Updates reflection binder and source generator to skip ignored properties during binding and constructor-parameter matching.
  • Adds/extends tests and updates package documentation examples to cover ignore behavior and ErrorOnUnknownConfiguration.

Reviewed changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.TestClasses.csAdds a primary-ctor test type with an ignored property to validate ctor/property matching behavior.
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.Helpers.csExtends ComplexOptions with an ignored property for binder test coverage.
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.csAdds tests asserting ignored properties aren’t bound and don’t trip ErrorOnUnknownConfiguration, plus ctor-matching behavior.
src/libraries/Microsoft.Extensions.Configuration.Binder/src/ConfigurationBinder.csSkips ignored properties in reflection binding and in ctor-parameter/property equivalence checks; adds IsIgnoredProperty.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Specs/TypeIndex.csEnsures generator considers property.IsIgnored when deciding if a property is bindable.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Specs/Members/PropertySpec.csAdds IsIgnored flag to property spec model used by the generator.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Parser/KnownTypeSymbols.csAdds symbol lookup for ConfigurationIgnoreAttribute for generator parsing.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/ConfigurationBindingGenerator.Parser.csParses [ConfigurationIgnore] and attempts to incorporate it into property/ctor matching.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/PACKAGE.mdUpdates package example to mention/use [ConfigurationIgnore].
src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationIgnoreAttribute.csAdds the new public attribute type.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/ref/Microsoft.Extensions.Configuration.Abstractions.csAdds the attribute to the reference assembly surface area.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/README.mdUpdates README example to mention/use [ConfigurationIgnore].

@cincuranetcincuranet changed the title Add COnfigurationIgnoreAttributeAdd ConfigurationIgnoreAttributeApr 2, 2026
CopilotAI review requested due to automatic review settings April 9, 2026 11:37

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

Comments suppressed due to low confidence (1)

src/libraries/Microsoft.Extensions.Configuration.Binder/src/ConfigurationBinder.cs:256

  • The constructor-parameter/property check is case-sensitive (p.Name == property.Name), but constructor parameter ↔ property equivalence is treated case-insensitively elsewhere (e.g., DoAllParametersHaveEquivalentProperties uses OrdinalIgnoreCase). This can cause properties whose names differ only by casing (common with primary ctors like "color" → "Color") to be bound again instead of going through the ctor-parameter path. Consider using an OrdinalIgnoreCase comparison here for consistency and to avoid unintended extra binding/setter side-effects.

if (constructorParameters is null || !constructorParameters.Any(p => p.Name == property.Name))
{
BindProperty(property, instance, configuration, options);
}

@rosebyte
rosebyteforce-pushed the feature/configuration-ignore-attribute branch from bf00b83 to bac2378CompareApril 9, 2026 13:24
CopilotAI review requested due to automatic review settings April 9, 2026 13:28

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

CopilotAI review requested due to automatic review settings April 9, 2026 16:50
@rosebyte
rosebyte marked this pull request as ready for review April 9, 2026 16:51

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

@tarekghtarekgh left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

CopilotAI review requested due to automatic review settings April 13, 2026 07:30

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

@rosebyte
rosebyte merged commit ebf02b3 into dotnet:mainApr 14, 2026
98 of 100 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 15, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: Add ConfigurationIgnoreAttribute to exclude properties from configuration binding

4 participants

@rosebyte@cincuranet@tarekgh
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add ConfigurationIgnoreAttribute - #126396

Merged
rosebyte merged 8 commits into
dotnet:mainfrom
rosebyte:feature/configuration-ignore-attribute
Apr 14, 2026
Merged

Add ConfigurationIgnoreAttribute#126396
rosebyte merged 8 commits into
dotnet:mainfrom
rosebyte:feature/configuration-ignore-attribute

Conversation

@rosebyte

Copy link
Copy Markdown
Member

Fixes#125111

Add ConfigurationIgnoreAttribute so configuration binding can explicitly skip selected properties.

Changes

  • Added ConfigurationIgnoreAttribute to Microsoft.Extensions.Configuration.Abstractions (implementation + ref).
  • Reflection binder now skips ignored properties.
  • Constructor-parameter/property matching now treats ignored properties as non-bindable.
  • Source generator updated to parse and honor ignored properties.
  • Added tests for ignore behavior, ErrorOnUnknownConfiguration, and constructor matching with ignored properties.
  • Updated Abstractions README/PACKAGE examples.

Validation

  • dotnet build for Abstractions and Binder.
  • Binder unit tests: 296 passed, 0 failed.
  • Source-generation tests: 347 total, 0 failed (28 skipped by conditions).

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-extensions-configuration
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new ConfigurationIgnoreAttribute to the configuration abstractions and updates both the reflection-based binder and the source generator so selected properties can be explicitly excluded from binding.

Changes:

  • Introduces ConfigurationIgnoreAttribute in Microsoft.Extensions.Configuration.Abstractions (impl + ref surface).
  • Updates reflection binder and source generator to skip ignored properties during binding and constructor-parameter matching.
  • Adds/extends tests and updates package documentation examples to cover ignore behavior and ErrorOnUnknownConfiguration.

Reviewed changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.TestClasses.csAdds a primary-ctor test type with an ignored property to validate ctor/property matching behavior.
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.Helpers.csExtends ComplexOptions with an ignored property for binder test coverage.
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.csAdds tests asserting ignored properties aren’t bound and don’t trip ErrorOnUnknownConfiguration, plus ctor-matching behavior.
src/libraries/Microsoft.Extensions.Configuration.Binder/src/ConfigurationBinder.csSkips ignored properties in reflection binding and in ctor-parameter/property equivalence checks; adds IsIgnoredProperty.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Specs/TypeIndex.csEnsures generator considers property.IsIgnored when deciding if a property is bindable.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Specs/Members/PropertySpec.csAdds IsIgnored flag to property spec model used by the generator.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Parser/KnownTypeSymbols.csAdds symbol lookup for ConfigurationIgnoreAttribute for generator parsing.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/ConfigurationBindingGenerator.Parser.csParses [ConfigurationIgnore] and attempts to incorporate it into property/ctor matching.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/PACKAGE.mdUpdates package example to mention/use [ConfigurationIgnore].
src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationIgnoreAttribute.csAdds the new public attribute type.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/ref/Microsoft.Extensions.Configuration.Abstractions.csAdds the attribute to the reference assembly surface area.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/README.mdUpdates README example to mention/use [ConfigurationIgnore].

@cincuranetcincuranet changed the title Add COnfigurationIgnoreAttributeAdd ConfigurationIgnoreAttributeApr 2, 2026
CopilotAI review requested due to automatic review settings April 9, 2026 11:37

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

Comments suppressed due to low confidence (1)

src/libraries/Microsoft.Extensions.Configuration.Binder/src/ConfigurationBinder.cs:256

  • The constructor-parameter/property check is case-sensitive (p.Name == property.Name), but constructor parameter ↔ property equivalence is treated case-insensitively elsewhere (e.g., DoAllParametersHaveEquivalentProperties uses OrdinalIgnoreCase). This can cause properties whose names differ only by casing (common with primary ctors like "color" → "Color") to be bound again instead of going through the ctor-parameter path. Consider using an OrdinalIgnoreCase comparison here for consistency and to avoid unintended extra binding/setter side-effects.

if (constructorParameters is null || !constructorParameters.Any(p => p.Name == property.Name))
{
BindProperty(property, instance, configuration, options);
}

@rosebyte
rosebyteforce-pushed the feature/configuration-ignore-attribute branch from bf00b83 to bac2378CompareApril 9, 2026 13:24
CopilotAI review requested due to automatic review settings April 9, 2026 13:28

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

CopilotAI review requested due to automatic review settings April 9, 2026 16:50
@rosebyte
rosebyte marked this pull request as ready for review April 9, 2026 16:51

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

@tarekghtarekgh left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

CopilotAI review requested due to automatic review settings April 13, 2026 07:30

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

@rosebyte
rosebyte merged commit ebf02b3 into dotnet:mainApr 14, 2026
98 of 100 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 15, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: Add ConfigurationIgnoreAttribute to exclude properties from configuration binding

4 participants

@rosebyte@cincuranet@tarekgh
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add ConfigurationIgnoreAttribute - #126396

Merged
rosebyte merged 8 commits into
dotnet:mainfrom
rosebyte:feature/configuration-ignore-attribute
Apr 14, 2026
Merged

Add ConfigurationIgnoreAttribute#126396
rosebyte merged 8 commits into
dotnet:mainfrom
rosebyte:feature/configuration-ignore-attribute

Conversation

@rosebyte

Copy link
Copy Markdown
Member

Fixes#125111

Add ConfigurationIgnoreAttribute so configuration binding can explicitly skip selected properties.

Changes

  • Added ConfigurationIgnoreAttribute to Microsoft.Extensions.Configuration.Abstractions (implementation + ref).
  • Reflection binder now skips ignored properties.
  • Constructor-parameter/property matching now treats ignored properties as non-bindable.
  • Source generator updated to parse and honor ignored properties.
  • Added tests for ignore behavior, ErrorOnUnknownConfiguration, and constructor matching with ignored properties.
  • Updated Abstractions README/PACKAGE examples.

Validation

  • dotnet build for Abstractions and Binder.
  • Binder unit tests: 296 passed, 0 failed.
  • Source-generation tests: 347 total, 0 failed (28 skipped by conditions).

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-extensions-configuration
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new ConfigurationIgnoreAttribute to the configuration abstractions and updates both the reflection-based binder and the source generator so selected properties can be explicitly excluded from binding.

Changes:

  • Introduces ConfigurationIgnoreAttribute in Microsoft.Extensions.Configuration.Abstractions (impl + ref surface).
  • Updates reflection binder and source generator to skip ignored properties during binding and constructor-parameter matching.
  • Adds/extends tests and updates package documentation examples to cover ignore behavior and ErrorOnUnknownConfiguration.

Reviewed changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.TestClasses.csAdds a primary-ctor test type with an ignored property to validate ctor/property matching behavior.
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.Helpers.csExtends ComplexOptions with an ignored property for binder test coverage.
src/libraries/Microsoft.Extensions.Configuration.Binder/tests/Common/ConfigurationBinderTests.csAdds tests asserting ignored properties aren’t bound and don’t trip ErrorOnUnknownConfiguration, plus ctor-matching behavior.
src/libraries/Microsoft.Extensions.Configuration.Binder/src/ConfigurationBinder.csSkips ignored properties in reflection binding and in ctor-parameter/property equivalence checks; adds IsIgnoredProperty.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Specs/TypeIndex.csEnsures generator considers property.IsIgnored when deciding if a property is bindable.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Specs/Members/PropertySpec.csAdds IsIgnored flag to property spec model used by the generator.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/Parser/KnownTypeSymbols.csAdds symbol lookup for ConfigurationIgnoreAttribute for generator parsing.
src/libraries/Microsoft.Extensions.Configuration.Binder/gen/ConfigurationBindingGenerator.Parser.csParses [ConfigurationIgnore] and attempts to incorporate it into property/ctor matching.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/PACKAGE.mdUpdates package example to mention/use [ConfigurationIgnore].
src/libraries/Microsoft.Extensions.Configuration.Abstractions/src/ConfigurationIgnoreAttribute.csAdds the new public attribute type.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/ref/Microsoft.Extensions.Configuration.Abstractions.csAdds the attribute to the reference assembly surface area.
src/libraries/Microsoft.Extensions.Configuration.Abstractions/README.mdUpdates README example to mention/use [ConfigurationIgnore].

@cincuranetcincuranet changed the title Add COnfigurationIgnoreAttributeAdd ConfigurationIgnoreAttributeApr 2, 2026
CopilotAI review requested due to automatic review settings April 9, 2026 11:37

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

Comments suppressed due to low confidence (1)

src/libraries/Microsoft.Extensions.Configuration.Binder/src/ConfigurationBinder.cs:256

  • The constructor-parameter/property check is case-sensitive (p.Name == property.Name), but constructor parameter ↔ property equivalence is treated case-insensitively elsewhere (e.g., DoAllParametersHaveEquivalentProperties uses OrdinalIgnoreCase). This can cause properties whose names differ only by casing (common with primary ctors like "color" → "Color") to be bound again instead of going through the ctor-parameter path. Consider using an OrdinalIgnoreCase comparison here for consistency and to avoid unintended extra binding/setter side-effects.

if (constructorParameters is null || !constructorParameters.Any(p => p.Name == property.Name))
{
BindProperty(property, instance, configuration, options);
}

@rosebyte
rosebyteforce-pushed the feature/configuration-ignore-attribute branch from bf00b83 to bac2378CompareApril 9, 2026 13:24
CopilotAI review requested due to automatic review settings April 9, 2026 13:28

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

CopilotAI review requested due to automatic review settings April 9, 2026 16:50
@rosebyte
rosebyte marked this pull request as ready for review April 9, 2026 16:51

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

@tarekghtarekgh left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

CopilotAI review requested due to automatic review settings April 13, 2026 07:30

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated no new comments.

@rosebyte
rosebyte merged commit ebf02b3 into dotnet:mainApr 14, 2026
98 of 100 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 15, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[API Proposal]: Add ConfigurationIgnoreAttribute to exclude properties from configuration binding

4 participants

@rosebyte@cincuranet@tarekgh