Skip to main content

SvgIconGenerator by Matt Schneeberger

NuGet / site data

Nuget GitHub last commit GitHub Repo stars

Details

Info

info

Name: SvgIconGenerator

SVG icon source generator

Author: Matt Schneeberger

NuGet: https://www.nuget.org/packages/SvgIconGenerator/

You can find more details at https://github.com/helluvamatt/SvgIconGenerator

Source: https://github.com/helluvamatt/SvgIconGenerator

Author

note

Matt Schneeberger Alt text

Original Readme

note

SVG Icon Generator

A C# source generator that automatically creates strongly-typed icon properties from SVG files.

Installation

Install the NuGet package in your project:

dotnet add package SvgIconGenerator
Usage

######### 1. Organize Your SVG Files

Place your SVG icon files in a folder within your project (e.g., Icons/):

YourProject/
├── Icons/
│ ├── user-circle.svg
│ ├── home.svg
│ └── settings.svg
└── Program.cs

######### 2. Add SVG Files as AdditionalFiles

In your .csproj file, add the SVG files as AdditionalFiles:

<ItemGroup>
<AdditionalFiles Include="Icons/*.svg" />
</ItemGroup>

Important: Adding files as AdditionalFiles ensures that changes to SVG files trigger regeneration during incremental compilation.

######### 3. Create an Icon Class

Create a static partial class and decorate it with the [GenerateIcons] attribute:

[GenerateIcons]
internal static partial class MyIcons;

You can optionally specify a glob pattern to filter which SVG files to include:

// Include all SVG files from AdditionalFiles
[GenerateIcons]
internal static partial class AllIcons;

// Filter by glob pattern
[GenerateIcons("Icons/*.svg")]
internal static partial class MyIcons;

######### 4. Access Generated Icons

The source generator will create properties for each SVG file. Property names are automatically converted from kebab-case to PascalCase:

// user-circle.svg becomes UserCircle
IconDto icon = MyIcons.UserCircle;

Console.WriteLine($"Icon name: {icon.Name}");
Console.WriteLine($"ViewBox: {icon.DefaultAttributes["viewBox"]}");
Console.WriteLine($"SVG content: {icon.InnerContent}");

######### 5. Render Icons

The IconDto contains everything needed to render the icon:

public static string RenderIcon(IconDto icon, Dictionary<string, string>? customAttributes = null)
{
// Merge default attributes with custom overrides
var attributes = new Dictionary<string, string>(icon.DefaultAttributes);
if (customAttributes != null)
{
foreach (var kvp in customAttributes)
{
attributes[kvp.Key] = kvp.Value;
}
}

// Build attribute string
var attrString = string.Join(" ", attributes.Select(kvp => $"{kvp.Key}=\"{kvp.Value}\""));

// Return complete SVG
return $"<svg {attrString}>{icon.InnerContent}</svg>";
}

// Use it
string svg = RenderIcon(MyIcons.UserCircle, new Dictionary<string, string>
{
["class"] = "icon",
["width"] = "24",
["height"] = "24"
});

You can use this generator with popular icon libraries installed via NPM, such as Bootstrap Icons, Lucide, Heroicons, or Feather Icons.

######### Example: Lucide Icons

  1. Install Lucide icons via NPM:
npm install lucide-static
  1. Add the icons as AdditionalFiles in your .csproj:
<ItemGroup>
<AdditionalFiles Include="node_modules/lucide-static/icons/*.svg" />
</ItemGroup>
  1. Create the icon class with optional glob pattern filter:
[GenerateIcons("node_modules/lucide-static/icons/*.svg")]
internal static partial class LucideIcons;
  1. Access any Lucide icon:
IconDto icon = LucideIcons.UserCircle;
IconDto icon2 = LucideIcons.ShoppingCart;
IconDto icon3 = LucideIcons.AlertTriangle;

######### Example: Bootstrap Icons

npm install bootstrap-icons
<ItemGroup>
<AdditionalFiles Include="node_modules/bootstrap-icons/icons/*.svg" />
</ItemGroup>
[GenerateIcons("node_modules/bootstrap-icons/icons/*.svg")]
internal static partial class BootstrapIcons;

######### Example: Heroicons

npm install heroicons
<ItemGroup>
<AdditionalFiles Include="node_modules/heroicons/24/outline/*.svg" />
<AdditionalFiles Include="node_modules/heroicons/24/solid/*.svg" />
</ItemGroup>
// Outline style icons
[GenerateIcons("node_modules/heroicons/24/outline/*.svg")]
internal static partial class HeroiconsOutline;

// Solid style icons
[GenerateIcons("node_modules/heroicons/24/solid/*.svg")]
internal static partial class HeroiconsSolid;

######### Multiple Icon Sets

You can create multiple icon classes in the same project to organize different icon sets:

<ItemGroup>
<AdditionalFiles Include="node_modules/lucide-static/icons/*.svg" />
<AdditionalFiles Include="Icons/custom/*.svg" />
<AdditionalFiles Include="Icons/logos/*.svg" />
</ItemGroup>
[GenerateIcons("node_modules/lucide-static/icons/*.svg")]
internal static partial class LucideIcons;

[GenerateIcons("Icons/custom/*.svg")]
internal static partial class CustomIcons;

[GenerateIcons("Icons/logos/*.svg")]
internal static partial class LogoIcons;
How It Works
  1. The source generator reads SVG files from AdditionalFiles in your project
  2. Files are optionally filtered by glob pattern (if specified in the attribute)
  3. For each SVG file, it:
    • Extracts the root element's attributes (excluding xmlns and class)
    • Captures the inner SVG content
    • Converts the filename to PascalCase for the property name
  4. Generates a partial class with IconDto properties for each icon
  5. Incremental compilation: Changes to SVG files automatically trigger regeneration
IconDto Structure

The generated IconDto record contains:

  • Name (string): The original kebab-case filename without extension
  • DefaultAttributes (IReadOnlyDictionary<string, string>): SVG root attributes like viewBox, fill, stroke, etc.
  • InnerContent (string): The inner HTML content (paths, circles, etc.)
Example SVG Input

Given an SVG file Icons/user-circle.svg:

<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<circle cx="12" cy="12" r="10"/>
<circle cx="12" cy="10" r="3"/>
<path d="M7 20.662V19a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v1.662"/>
</svg>

The generator creates:

/// <summary>
/// Icon: user-circle
/// </summary>
public static readonly IconDto UserCircle = new IconDto(
"user-circle",
new global::System.Collections.Generic.Dictionary<string, string> {
\{ "width", "24" },
\{ "height", "24" },
\{ "viewBox", "0 0 24 24" },
\{ "fill", "none" },
\{ "stroke", "currentColor" },
\{ "stroke-width", "2" },
},
"<circle cx=\"12\" cy=\"12\" r=\"10\"/><circle cx=\"12\" cy=\"10\" r=\"3\"/><path d=\"M7 20.662V19a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v1.662\"/>");
Requirements
  • .NET Standard 2.0 or higher
  • C# 9.0 or higher (for record types)
License

See the repository for license information.

About

note

Generating classes from SVG icons to be used in C# projects.

How to use

Example (source csproj, source files)

This is the CSharp Project that references SvgIconGenerator

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="SvgIconGenerator" Version="0.0.4">
</PackageReference>
</ItemGroup>
<ItemGroup>
<AdditionalFiles Include="Icons/*.svg" />
</ItemGroup>

<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
</Project>

Generated Files

Those are taken from $(BaseIntermediateOutputPath)\GX

namespace SvgIconGenerator
{
/// <summary>
/// Marks a static partial class for icon generation.
/// The source generator will scan AdditionalFiles for SVG files matching the specified glob pattern
/// and generate static readonly IconDto properties for each icon found.
/// </summary>
/// <remarks>
/// SVG files must be added to the project as AdditionalFiles in the .csproj file:
/// <code>
/// &lt;ItemGroup&gt;
/// &lt;AdditionalFiles Include="icons/**/*.svg" /&gt;
/// &lt;/ItemGroup&gt;
/// </code>
/// </remarks>
[global::System.AttributeUsage(global::System.AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
internal sealed class GenerateIconsAttribute : global::System.Attribute
{
/// <summary>
/// Initializes a new instance of the <see cref="GenerateIconsAttribute"/> class.
/// </summary>
public GenerateIconsAttribute()
{
}

/// <summary>
/// Initializes a new instance of the <see cref="GenerateIconsAttribute"/> class.
/// </summary>
/// <param name="globPattern">
/// Optional glob pattern to filter SVG files from AdditionalFiles.
/// If not specified, all SVG files in AdditionalFiles will be included.
/// Supports * (wildcard) and ** (recursive) patterns.
/// Example: <code>"node_modules/lucide-static/icons/*.svg"</code>
/// </param>
public GenerateIconsAttribute(string globPattern)
{
}
}
}

Useful

Download Example (.NET C#)

Share SvgIconGenerator

https://ignatandrei.github.io/RSCG_Examples/v2/docs/SvgIconGenerator

Category "FilesToCode" has the following generators:

1 Chorn.EmbeddedResourceAccessGenerator Nuget GitHub Repo stars 2024-01-21

2 corecraft Nuget GitHub Repo stars 2024-02-17

3 Datacute.EmbeddedResourcePropertyGenerator Nuget GitHub Repo stars 2024-11-03

4 DotnetYang Nuget GitHub Repo stars 2024-06-29

5 EmbedResourceCSharp Nuget GitHub Repo stars 2023-04-16

6 kli.Localize Nuget GitHub Repo stars 2025-10-01

7 LingoGen Nuget GitHub Repo stars 2024-02-23

8 NFH.FileEmbed Nuget GitHub Repo stars 2025-08-08

9 NotNotAppSettings Nuget GitHub Repo stars 2024-01-26

10 Podimo.ConstEmbed Nuget GitHub Repo stars 2023-04-16

11 ResXGenerator Nuget GitHub Repo stars 2023-10-02

12 RSCG_JSON2Class Nuget GitHub Repo stars 2024-02-29

13 RSCG_Utils Nuget GitHub Repo stars 2023-04-16

14 Strings.ResourceGenerator Nuget GitHub Repo stars 2025-07-06

15 SvgIconGenerator Nuget GitHub Repo stars 2026-04-04

16 ThisAssembly_Resources Nuget GitHub Repo stars 2023-09-16

17 ThisAssembly.Strings Nuget GitHub Repo stars 2024-07-21

18 TypedPaths Nuget GitHub Repo stars 2026-04-01

19 Weave Nuget GitHub Repo stars 2024-01-27

See category

FilesToCode