Skip to content

Fix generic extension methods#197

Merged
PhenX merged 2 commits intomasterfrom
fix-generic-extension-methods
Mar 27, 2026
Merged

Fix generic extension methods#197
PhenX merged 2 commits intomasterfrom
fix-generic-extension-methods

Conversation

@PhenX
Copy link
Copy Markdown
Member

@PhenX PhenX commented Mar 27, 2026

Fixes #195

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Fixes runtime resolution failures for C# 14 extension members when the receiver type is generic (especially closed generics), by ensuring the generated expression-factory type names match what the runtime resolver computes.

Changes:

  • Update generated class naming to strip all global:: occurrences (including within generic argument lists) when sanitizing parameter type names.
  • Teach the generator to promote generic extension-block type parameters/constraints onto the generated Expression<T>() factory method.
  • Add unit, generator snapshot, and functional regression tests covering closed/open generic extension receivers (incl. constraints).

Reviewed changes

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

Show a summary per file
File Description
src/EntityFrameworkCore.Projectables/Services/ProjectionExpressionClassNameGenerator.cs Strips every global:: occurrence during parameter-type name sanitization to avoid generator/runtime name mismatches.
src/EntityFrameworkCore.Projectables.Generator/Interpretation/ProjectableInterpreter.BodyProcessors.cs Applies extension-block type parameters when no method-level type parameters were found.
src/EntityFrameworkCore.Projectables.Generator/Interpretation/ProjectableInterpreter.cs Refactors constraint clause construction to a shared helper.
src/EntityFrameworkCore.Projectables.Generator/Interpretation/ProjectableInterpreter.Helpers.cs Adds extension-block type parameter promotion + shared BuildConstraintClause helper.
tests/EntityFrameworkCore.Projectables.Tests/Services/ProjectionExpressionClassNameGeneratorTests.cs Adds unit coverage for global:: stripping inside generic type arguments.
tests/EntityFrameworkCore.Projectables.Generator.Tests/ExtensionMemberTests.cs Adds generator snapshot tests for generic receiver extension members (closed/open/with constraint).
tests/EntityFrameworkCore.Projectables.Generator.Tests/*.verified.txt Adds snapshots validating emitted code for new generator tests.
tests/EntityFrameworkCore.Projectables.FunctionalTests/ExtensionMembers/GenericWrapper.cs Adds a simple generic wrapper entity used by functional regression tests.
tests/EntityFrameworkCore.Projectables.FunctionalTests/ExtensionMembers/EntityExtensions.cs Adds extension-member definitions for closed/open generic wrappers.
tests/EntityFrameworkCore.Projectables.FunctionalTests/ExtensionMembers/ExtensionMemberTests.cs Adds functional regression tests for closed/open generic receiver extension members.
tests/EntityFrameworkCore.Projectables.FunctionalTests/ExtensionMembers/*.verified.txt Adds SQL snapshots for the new functional tests (net10).

@PhenX PhenX merged commit c8073a5 into master Mar 27, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

C# 14 extension block on generic type fails at runtime

2 participants