name | jos.enumeration |
nuget | https://www.nuget.org/packages/jos.enumeration/ |
link | https://github.com/joseftw/jos.enumeration |
author | Josef Ottosson |
Generating enum from static consts
This is how you can use jos.enumeration .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net9.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="JOS.Enumeration" Version="4.0.2" /> <PackageReference Include="JOS.Enumeration.SourceGenerator" Version="4.0.2" /> </ItemGroup> <PropertyGroup> <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath> </PropertyGroup> </Project>
The code that you will use is
// See https://aka.ms/new-console-template for more information using EnumDemo; Console.WriteLine("Hello, World!"); var cars= CarTypes.GetAll(); foreach (var car in cars) { Console.WriteLine(car.Description + " - " +car.Value); }
using JOS.Enumeration; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EnumDemo; partial record CarTypes : IEnumeration<CarTypes> { public static readonly CarTypes Dacia = new(1, "Dacia"); public static readonly CarTypes Tesla = new(2, "Tesla"); public static readonly CarTypes BMW = new(3, "BMW"); public static readonly CarTypes Mercedes = new(4, "Mercedes"); }
The code that is generated is
// <auto-generated> // This code was auto generated by JOS.Enumeration.SourceGenerator // </auto-generated> #nullable enable using System; using System.Collections; using System.Collections.Generic; #if NET8_0_OR_GREATER using System.Collections.Frozen; #endif using JOS.Enumeration; namespace EnumDemo; [System.Diagnostics.DebuggerDisplay("{Description}")] [System.CodeDom.Compiler.GeneratedCode("JOS.Enumeration.SourceGenerator", null)] partial record CarTypes : IComparable<EnumDemo.CarTypes> { private static readonly IReadOnlySet<EnumDemo.CarTypes> AllItems; static CarTypes() { AllItems = new HashSet<EnumDemo.CarTypes>(4) { Dacia, Tesla, BMW, Mercedes, }.ToFrozenSet(); } private CarTypes(int value, string description) { Value = value; Description = description ?? throw new ArgumentNullException(nameof(description)); } public int Value { get; } public string Description { get; } public static IReadOnlySet<EnumDemo.CarTypes> GetAll() { return AllItems; } public static IEnumerable<EnumDemo.CarTypes> GetEnumerable() { yield return Dacia; yield return Tesla; yield return BMW; yield return Mercedes; } public static EnumDemo.CarTypes FromValue(int value) { return value switch { 1 => Dacia, 2 => Tesla, 3 => BMW, 4 => Mercedes, _ => throw new InvalidOperationException($"'{value}' is not a valid value in 'EnumDemo.CarTypes'")}; } public static EnumDemo.CarTypes FromDescription(string description) { return description switch { "Dacia" => Dacia, "Tesla" => Tesla, "BMW" => BMW, "Mercedes" => Mercedes, _ => throw new InvalidOperationException($"'{description}' is not a valid description in 'EnumDemo.CarTypes'")}; } public static EnumDemo.CarTypes FromDescription(ReadOnlySpan<char> description) { return description switch { "Dacia" => Dacia, "Tesla" => Tesla, "BMW" => BMW, "Mercedes" => Mercedes, _ => throw new InvalidOperationException($"'{description}' is not a valid description in 'EnumDemo.CarTypes'")}; } public static Type ValueType => typeof(int); public int CompareTo(EnumDemo.CarTypes? other) => Value.CompareTo(other!.Value); public static implicit operator int (EnumDemo.CarTypes item) => item.Value; public static implicit operator EnumDemo.CarTypes(int value) => FromValue(value); }
// <auto-generated> // This code was auto generated by JOS.Enumeration.SourceGenerator // </auto-generated> #nullable enable using System; using JOS.Enumeration; namespace EnumDemo; [System.CodeDom.Compiler.GeneratedCode("JOS.Enumeration.SourceGenerator", null)] public static class Enumerations { public static class CarTypes { public static class Dacia { public const int Value = 1; public const string Description = "Dacia"; } public static class Tesla { public const int Value = 2; public const string Description = "Tesla"; } public static class BMW { public const int Value = 3; public const string Description = "BMW"; } public static class Mercedes { public const int Value = 4; public const string Description = "Mercedes"; } } }
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/jos.enumeration