ExtensionMethodsSourceGenerator 1.0.0
dotnet add package ExtensionMethodsSourceGenerator --version 1.0.0
NuGet\Install-Package ExtensionMethodsSourceGenerator -Version 1.0.0
<PackageReference Include="ExtensionMethodsSourceGenerator" Version="1.0.0" />
<PackageVersion Include="ExtensionMethodsSourceGenerator" Version="1.0.0" />
<PackageReference Include="ExtensionMethodsSourceGenerator" />
paket add ExtensionMethodsSourceGenerator --version 1.0.0
#r "nuget: ExtensionMethodsSourceGenerator, 1.0.0"
#:package ExtensionMethodsSourceGenerator@1.0.0
#addin nuget:?package=ExtensionMethodsSourceGenerator&version=1.0.0
#tool nuget:?package=ExtensionMethodsSourceGenerator&version=1.0.0
ExtensionMethodsSourceGenerator
What Is It For?
ExtensionMethodsSourceGenerator
is a Roslyn-based source generator that automatically produces extension methods from classes marked with the [ToExtensionMethod]
attribute. By scanning your code for public/internal static methods that have at least one parameter, it generates .g.cs
files containing the corresponding extension methods. This allows you to call those methods in a more fluent, extension-like syntax without manually duplicating code.
All generated extension method classes are marked as public
, regardless of the original class's accessibility. However, the accessibility of the methods themselves matches the original method modifier (public
or internal
).
How to Use
Installation~~~~
Via NuGet
Install-Package ExtensionMethodsSourceGenerator
Via Project Reference
- Clone or add the
ExtensionMethodsSourceGenerator
project to your solution. - Reference it as an analyzer in your consuming project’s
.csproj
:
<ItemGroup>
<ProjectReference Include="..\ExtensionMethodsSourceGenerator\ExtensionMethodsSourceGenerator.csproj"
OutputItemType="Analyzer"
ReferenceOutputAssembly="false" />
</ItemGroup>
Adding the [ToExtensionMethod]
Attribute
Decorate a class with [ToExtensionMethod]
:
[ToExtensionMethod]
public static class MathUtilities
{
public static int Add(int x, int y) => x + y;
public static string Repeat(string value, int count)
=> new string(value[0], count);
}
When you build, the source generator will create an extension class (or classes) in .g.cs
files. These will contain extension methods like:
namespace ExtensionMethods
{
public static partial class IntExtensions
{
public static int Add(this int x, int y)
{
return MathUtilities.Add(x, y);
}
}
public static partial class StringExtensions
{
public static string Repeat(this string value, int count)
{
return MathUtilities.Repeat(value, count);
}
}
}
Specific Conditions for Generation
- Class-Level Attribute: The class must be annotated with
[ToExtensionMethod]
. - Class Accessibility: The class should be declared as
public
orinternal
. This determines the accessibility of the generated methods. - Static Classes and Methods: The generator only considers
static
methods. - Parameter Requirement: Methods must have at least one parameter to be a valid candidate for extension method generation.
File Naming Convention
The generator creates a separate file for each discovered method. The naming pattern is:
{ClassName}.{MethodName}_{ParametersForFileName}_Extensions.g.cs
Here, ParametersForFileName
is formed by concatenating the types of the method's parameters, with each type's name separated by underscores (_
). For example:
- A method with parameters
(int x, int y)
generates a file namedMathUtilities.Add_Int_Int_Extensions.g.cs
. - A method with parameters
(string value, int count)
generates a file namedMathUtilities.Repeat_String_Int_Extensions.g.cs
.
Special Cases Handled Automatically
- Namespace & Usings: The generator captures your original
using
directives and uses them as needed in the emitted code. - Generic Classes & Methods: Handles generic classes and methods, ensuring constraints (e.g.,
where T : class
) are preserved or adjusted to avoid conflicts. - Avoiding Generic Collisions: Ensures no conflicts between class-level and method-level generics by appending suffixes to the class generics when necessary (e.g.,
TClassGeneric
). - Method Overloads: Multiple static methods with the same name but different parameter signatures are handled gracefully, each generating a unique file.
- Async & Task Methods: Handles methods returning
Task
orTask<T>
(both with and withoutawait
).
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Microsoft.CodeAnalysis.CSharp (>= 4.3.0)
- Microsoft.CodeAnalysis.CSharp.Workspaces (>= 4.3.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last Updated |
---|---|---|
1.0.0 | 100 | 1/13/2025 |