StaticDictionaries 1.3.1

.NET Standard 2.0
dotnet add package StaticDictionaries --version 1.3.1
NuGet\Install-Package StaticDictionaries -Version 1.3.1
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="StaticDictionaries" Version="1.3.1" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add StaticDictionaries --version 1.3.1
#r "nuget: StaticDictionaries, 1.3.1"
#r directive can be used in F# Interactive, C# scripting and .NET Interactive. Copy this into the interactive tool or source code of the script to reference the package.
// Install StaticDictionaries as a Cake Addin
#addin nuget:?package=StaticDictionaries&version=1.3.1

// Install StaticDictionaries as a Cake Tool
#tool nuget:?package=StaticDictionaries&version=1.3.1

StaticDictionaries πŸ“š

.NET CodeFactor Quality Gate Status codecov License: MIT NuGet version (SoftCircuits.Silk)

Simple high performance solution for data hardcoding. Smart. Flexible. Powerful.

Powered by source generators. Without using reflection. .NET 7 now supported βš’

StaticDictionaries is a convinient library for data hardcoding in your project. Just decorate the enum using attributes, the source generator will do the rest for you. Minimum code and time spent - maximum result and performance. Property management has never been so convenient. Generated methods for managing enum without reflection will make development pleasant and faster than ever.

Installing StaticDictionaries

StaticDictionaries is available on NuGet.

dotnet add package StaticDictionaries

Install-Package StaticDictionaries

Basic usage by stepsπŸ›Έ

  1. Decorate your enum with [StaticDictionary] attribute and define arguments to generate properties:
[StaticDictionary("Surname", "Age")]
public enum User
  1. Decorate your enum members with [Value] attribute and define member values:
[Value("Brown", 27)]
John = 1
  1. Build project to run source generator and get access to generated methods:
int id = User.John.Id();
int age = User.John.Age();
string name = User.John.Name();
string surname = User.John.Surname();

Powerful enum management 🦾

Source generator creates some methods in [EnumName]Extensions class for convenient and fast enum management:

  • Length quantity of all enum members.
  • MinId returns min Id().
  • MaxId returns max Id().
  • All() returns an array of all enum members.
  • GetById() returns member or NotSupportedException.
  • Json() returns serialized enum in json format.
  • Xml() returns serialized enum in xml format.

Dictionary supported primitive types πŸ—Ώ

CLR type Status
int βœ…
bool βœ…
char βœ…
double βœ…
string βœ…

Samples 🀝

Employee dictionary with Name, Age and Active properties:

[StaticDictionary("Name", "Age", "Active")]
public enum Employee
{
    [Value("Maxim Jhonson", 18, true)]
    Maxim = 1,
    [Value("John Jhonson", 23, false)]
    John = 2
}

public static void Main()
{
    int johnAge = Employee.John.Age();
    int maximAge = Employee.Maxim.Age();
    
    string johnName = Employee.John.Name();
    string maximName = Employee.Maxim.Name();
}

Source generator creates [EnumName]Extensions class that provide some powerful functionality for managing your enum:

[StaticDictionary("Name", "IsLast")]
public enum Status
{
    [Value("New state", false)]
    New = 1,
    [Value("In progress", false)]
    InProgress = 2,
    [Value("Completed", true)]
    Completed = 3
}

public static void Main()
{
    Status status = StatusExtensions.GetById(2);
    
    Status[] statuses = StatusExtensions
                      .All()
                      .Where(x => !x.IsLast())
                      .ToArray();
}

Id() and Name() methods are generated by default if you do not override them.

[StaticDictionary]
public enum Metal
{
    [Value]
    Gold = 1,
    [Value]
    Ferrum = 2
}

public static void Main()
{
    int goldId = Metal.Gold.Id(); 
    string ferrumName = Metal.Ferrum.Name();
}

Important notes ⚠️

  • [StaticDictionary] parameter names must not be duplicated.
  • [StaticDictionary] parameter names must use the English alphabet only because they will be generated into methods.
  • All [Value] attrubutes must contain such arguments quantity as [StaticDictionary].
  • All [StaticDictionary] enum members can contain [Value] attribute with arguments.
  • Generator creates two methods by default: Id() with (int)member and Name() with nameof(member) if you do not override them.
  • enum members without [Value] attribute will be ignored.
  • enum property names must not be equal to [EnumName]Extensions (c# naming rules for methods).
  • Json() and Xml() methods generated only if you mark enum with [JsonSupport] or [XmlSupport].
  • enum members that use bitwise operators must not contain [Value] attribute.
  • Parameter types are determined automatically, so all parameters in a sequence must be of the same type. For example, all of the first types should be string, and all of the second types should be bool.

Performance πŸš€

Despite the convenient format of use, the performance remained at a high level, and thanks to separate methods for working with an Enum without reflection, performance increased significantly in some indicators:

BenchmarkDotNet=v0.13.1, OS=Windows 10.0.19044.1766 (21H2)
AMD Ryzen 5 3600, 1 CPU, 12 logical and 6 physical cores
.NET SDK=6.0.301
  [Host]     : .NET 6.0.6 (6.0.622.26707), X64 RyuJIT  [AttachedDebugger]
  DefaultJob : .NET 6.0.6 (6.0.622.26707), X64 RyuJIT
Method Mean Error StdDev Median
ClassicAccessToMemberName 0.0001 ns 0.0002 ns 0.0001 ns 0.0001 ns
GeneratedAccessToMemberName 0.0039 ns 0.0041 ns 0.0030 ns 0.0014 ns
ReflectionGetAllMembers 562.4409 ns 3.8498 ns 3.6011 ns 562.4710 ns
GeneratedGetAllMembers 5.6408 ns 0.1011 ns 0.0946 ns 5.6575 ns
GetEnumMemberById 0.0008 ns 0.0008 ns 0.0007 ns 0.0004 ns
GeneratedGetEnumMemberById 0.0001 ns 0.0002 ns 0.0002 ns 0.0000 ns
Product Versions
.NET net5.0 net5.0-windows net6.0 net6.0-android net6.0-ios net6.0-maccatalyst net6.0-macos net6.0-tvos net6.0-windows net7.0 net7.0-android net7.0-ios net7.0-maccatalyst net7.0-macos net7.0-tvos net7.0-windows
.NET Core netcoreapp2.0 netcoreapp2.1 netcoreapp2.2 netcoreapp3.0 netcoreapp3.1
.NET Standard netstandard2.0 netstandard2.1
.NET Framework net461 net462 net463 net47 net471 net472 net48
MonoAndroid monoandroid
MonoMac monomac
MonoTouch monotouch
Tizen tizen40 tizen60
Xamarin.iOS xamarinios
Xamarin.Mac xamarinmac
Xamarin.TVOS xamarintvos
Xamarin.WatchOS xamarinwatchos
Compatible target framework(s)
Additional computed target framework(s)
Learn more about Target Frameworks and .NET Standard.

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.3.1 85 11/19/2022
1.3.1-preview1 43 11/18/2022
1.3.0 81 11/11/2022
1.2.0 755 10/1/2022
1.1.0 191 8/10/2022
1.0.0 195 7/10/2022
1.0.0-rc 87 7/3/2022
1.0.0-beta2 68 7/2/2022
1.0.0-beta 84 7/2/2022

.NET7 support