Skip to main content

TaggedEnum by Alor'idal

NuGet / site data

Nuget GitHub last commit GitHub Repo stars

Details

Info

info

Name: TaggedEnum

Enum like tagged union

Author: Alor'idal

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

You can find more details at https://github.com/al0rid4l/SixTatami

Source: https://github.com/al0rid4l/SixTatami

Author

note

Alor'idal Alt text

Original Readme

note

cs-lib-template

Al0rid4l's dog food.

About

note

Generate dictionary from enum

Also retrieved enum by value or name.

And an extension method JSON serializer for enum.

How to use

Example (source csproj, source files)

This is the CSharp Project that references TaggedEnum

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

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

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

<ItemGroup>
<PackageReference Include="TaggedEnum" Version="2.0.1" />
</ItemGroup>



</Project>

Generated Files

Those are taken from $(BaseIntermediateOutputPath)\GX

// <auto-generated />
#nullable enable
using System.Runtime.CompilerServices;
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics;
using System.Text.Json;
using System.Text.Json.Serialization;
using TaggedEnum;

namespace EnumDemo;

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
public static class EnumDemoCarTypesExtension {
private static readonly Dictionary<global::EnumDemo.CarTypes, string> ValueNameMap = new(new EnumDemoCarTypesComparer()) {

{global::EnumDemo.CarTypes.None, "None"},
{global::EnumDemo.CarTypes.Dacia, "Dacia"},
{global::EnumDemo.CarTypes.Tesla, "Tesla"},
{global::EnumDemo.CarTypes.BMW, "BMW"},
{global::EnumDemo.CarTypes.Mercedes, "Mercedes"},
};









extension(global::EnumDemo.CarTypes self) {
public string Data {
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
get =>
self switch {

global::EnumDemo.CarTypes.None => (string)"this is none",
global::EnumDemo.CarTypes.Dacia => (string)"this is dacia",
global::EnumDemo.CarTypes.Tesla => (string)"this is tesla",
global::EnumDemo.CarTypes.BMW => (string)"this is bwm",
global::EnumDemo.CarTypes.Mercedes => (string)"this is mercedes",
_ => DataNotFoundException.ThrowWithMessage<string>($"Data of {ValueNameMap[self]} not found.")
};
}
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
public static string ToStringFast(this global::EnumDemo.CarTypes self)
=> self switch {

global::EnumDemo.CarTypes.None => "None",
global::EnumDemo.CarTypes.Dacia => "Dacia",
global::EnumDemo.CarTypes.Tesla => "Tesla",
global::EnumDemo.CarTypes.BMW => "BMW",
global::EnumDemo.CarTypes.Mercedes => "Mercedes",
_ => UnreachableException.ThrowWithMessage<string>("Never reach here.")
};

[MethodImpl(MethodImplOptions.AggressiveInlining)]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
public static bool HasName(this global::EnumDemo.CarTypes self, string name)
=> self.ToStringFast() == name;

[MethodImpl(MethodImplOptions.AggressiveInlining)]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
public static bool HasData(this global::EnumDemo.CarTypes self, string data)
=> self.Data == data;

[MethodImpl(MethodImplOptions.AggressiveInlining)]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
public static bool Equals(this global::EnumDemo.CarTypes self, global::EnumDemo.CarTypes v)
=> self == v;

[MethodImpl(MethodImplOptions.AggressiveInlining)]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
public static bool TryGetDataByName(string name, [NotNullWhen(true)]out string? v) {
v = name switch {

"None" => (string)"this is none",
"Dacia" => (string)"this is dacia",
"Tesla" => (string)"this is tesla",
"BMW" => (string)"this is bwm",
"Mercedes" => (string)"this is mercedes",
_ => null
};
return v is not null;
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
public static bool TryGetValueByName(string name, [NotNullWhen(true)]out global::EnumDemo.CarTypes? v) {
v = name switch {

"None" => global::EnumDemo.CarTypes.None,
"Dacia" => global::EnumDemo.CarTypes.Dacia,
"Tesla" => global::EnumDemo.CarTypes.Tesla,
"BMW" => global::EnumDemo.CarTypes.BMW,
"Mercedes" => global::EnumDemo.CarTypes.Mercedes,
_ => null
};
return v is not null;
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
public static bool TryGetValueByData(string data, [NotNullWhen(true)]out global::EnumDemo.CarTypes? v) {
v = data switch {

(string)"this is none" => global::EnumDemo.CarTypes.None,
(string)"this is dacia" => global::EnumDemo.CarTypes.Dacia,
(string)"this is tesla" => global::EnumDemo.CarTypes.Tesla,
(string)"this is bwm" => global::EnumDemo.CarTypes.BMW,
(string)"this is mercedes" => global::EnumDemo.CarTypes.Mercedes,
_ => null
};
return v is not null;
}
}

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
internal sealed class EnumDemoCarTypesComparer: IEqualityComparer<global::EnumDemo.CarTypes> {
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(global::EnumDemo.CarTypes x, global::EnumDemo.CarTypes y) => x == y;

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public int GetHashCode([DisallowNull] global::EnumDemo.CarTypes obj) => (int)obj;
}

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
internal sealed class EnumDemoCarTypesstringComparer: IEqualityComparer<string> {
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(string? x, string? y) => x == y;

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public int GetHashCode([DisallowNull] string obj) => obj.GetHashCode();
}

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
public sealed class EnumDemoCarTypesToDataConverter: JsonConverter<global::EnumDemo.CarTypes> {
public override global::EnumDemo.CarTypes Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
string? token = reader.GetString();
return string.IsNullOrEmpty(token)
? JsonException.ThrowWithMessage<global::EnumDemo.CarTypes>($"Couldn't convert data \"{token}\" to global::EnumDemo.CarTypes.")
: EnumDemoCarTypesExtension.TryGetValueByData(token, out var result)
? result.Value : JsonException.ThrowWithMessage<global::EnumDemo.CarTypes>($"Couldn't find \"{token}\" in global::EnumDemo.CarTypes data.");
}

public override void Write(Utf8JsonWriter writer, global::EnumDemo.CarTypes value, JsonSerializerOptions options) {
writer.WriteStringValue(value.Data);
}
}

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
public sealed class EnumDemoCarTypesArrayToDataArrayConverter: JsonConverter<global::EnumDemo.CarTypes[]> {
public override global::EnumDemo.CarTypes[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
var list = new List<global::EnumDemo.CarTypes>();
while (reader.Read()) {
switch (reader.TokenType) {
case JsonTokenType.StartArray:
continue;
case JsonTokenType.EndArray:
goto label;
case JsonTokenType.String:
var v = reader.GetString() is not {} token ? UnreachableException.ThrowWithMessage<string>("JsonTokenType is string but reader.GetString() is null.") : token;
list.Add(EnumDemoCarTypesExtension.TryGetValueByData(
v,
out var item)
? item!.Value : JsonException.ThrowWithMessage<global::EnumDemo.CarTypes>($"Couldn't find \"{v}\" in global::EnumDemo.CarTypes data."));
continue;
default:
continue;
}
}
label:
return list.ToArray();
}

public override void Write(Utf8JsonWriter writer, global::EnumDemo.CarTypes[] arr, JsonSerializerOptions options) {
writer.WriteStartArray();
for (int i = 0, len = arr.Length; i < len; ++i) {
writer.WriteStringValue(arr[i].Data);
}
writer.WriteEndArray();
}
}

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
public sealed class NullableEnumDemoCarTypesArrayToDataArrayConverter: JsonConverter<global::EnumDemo.CarTypes?[]> {
public override global::EnumDemo.CarTypes?[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
var list = new List<global::EnumDemo.CarTypes?>();
while (reader.Read()) {
switch (reader.TokenType) {
case JsonTokenType.StartArray:
continue;
case JsonTokenType.EndArray:
goto label;
case JsonTokenType.Null:
list.Add(null);
continue;
case JsonTokenType.String:
var v = reader.GetString() is not {} token ? UnreachableException.ThrowWithMessage<string>("JsonTokenType is string but reader.GetString() is null.") : token;
list.Add(EnumDemoCarTypesExtension.TryGetValueByData(
v,
out var item)
? item!.Value : JsonException.ThrowWithMessage<global::EnumDemo.CarTypes>($"Couldn't find \"{v}\" in global::EnumDemo.CarTypes data."));
continue;
default:
continue;
}
}
label:
return list.ToArray();
}

public override void Write(Utf8JsonWriter writer, global::EnumDemo.CarTypes?[] arr, JsonSerializerOptions options) {
writer.WriteStartArray();
for (int i = 0, len = arr.Length; i < len; ++i) {
var v = arr[i];
if (v is null) {
writer.WriteNullValue();
} else {
writer.WriteStringValue(v.Value.Data);
}

}
writer.WriteEndArray();
}
}

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
public sealed class EnumDemoCarTypesEnumerableToDataEnumerableConverter: JsonConverter<IEnumerable<global::EnumDemo.CarTypes>> {
public override IEnumerable<global::EnumDemo.CarTypes> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
var list = new List<global::EnumDemo.CarTypes>();
while (reader.Read()) {
switch (reader.TokenType) {
case JsonTokenType.StartArray:
continue;
case JsonTokenType.EndArray:
goto label;
case JsonTokenType.String:
var v = reader.GetString() is not {} token ? UnreachableException.ThrowWithMessage<string>("JsonTokenType is string but reader.GetString() is null.") : token;
list.Add(EnumDemoCarTypesExtension.TryGetValueByData(
v,
out var item)
? item!.Value : JsonException.ThrowWithMessage<global::EnumDemo.CarTypes>($"Couldn't find \"{v}\" in global::EnumDemo.CarTypes data."));
continue;
default:
continue;
}
}
label:
return list.ToArray();
}

public override void Write(Utf8JsonWriter writer, IEnumerable<global::EnumDemo.CarTypes> values, JsonSerializerOptions options) {
writer.WriteStartArray();
foreach (var v in values) {
writer.WriteStringValue(v.Data);
}
writer.WriteEndArray();
}
}

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
public sealed class NullableEnumDemoCarTypesEnumerableToDataEnumerableConverter: JsonConverter<IEnumerable<global::EnumDemo.CarTypes?>> {
public override IEnumerable<global::EnumDemo.CarTypes?> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
var list = new List<global::EnumDemo.CarTypes?>();
while (reader.Read()) {
switch (reader.TokenType) {
case JsonTokenType.StartArray:
continue;
case JsonTokenType.EndArray:
goto label;
case JsonTokenType.Null:
list.Add(null);
continue;
case JsonTokenType.String:
var v = reader.GetString() is not {} token ? UnreachableException.ThrowWithMessage<string>("JsonTokenType is string but reader.GetString() is null.") : token;
list.Add(EnumDemoCarTypesExtension.TryGetValueByData(
v,
out var item)
? item!.Value : JsonException.ThrowWithMessage<global::EnumDemo.CarTypes>($"Couldn't find \"{v}\" in global::EnumDemo.CarTypes data."));
continue;
default:
continue;
}
}
label:
return list.ToArray();
}

public override void Write(Utf8JsonWriter writer, IEnumerable<global::EnumDemo.CarTypes?> values, JsonSerializerOptions options) {
writer.WriteStartArray();
foreach (var v in values) {
if (v is null) {
writer.WriteNullValue();
} else {
writer.WriteStringValue(v.Value.Data);
}
}
writer.WriteEndArray();
}
}

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
public sealed class EnumDemoCarTypesToNameConverter: JsonConverter<global::EnumDemo.CarTypes> {
public override global::EnumDemo.CarTypes Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
string? token = reader.GetString();
return string.IsNullOrEmpty(token)
? JsonException.ThrowWithMessage<global::EnumDemo.CarTypes>($"Couldn't convert name \"{token}\" to global::EnumDemo.CarTypes.")
: EnumDemoCarTypesExtension.TryGetValueByName(token, out var result)
? result.Value : JsonException.ThrowWithMessage<global::EnumDemo.CarTypes>($"Couldn't find \"{token}\" in global::EnumDemo.CarTypes name.");
}

public override void Write(Utf8JsonWriter writer, global::EnumDemo.CarTypes value, JsonSerializerOptions options) {
writer.WriteStringValue(value.ToStringFast());
}
}

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
public sealed class EnumDemoCarTypesArrayToNameArrayConverter: JsonConverter<global::EnumDemo.CarTypes[]> {
public override global::EnumDemo.CarTypes[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
var list = new List<global::EnumDemo.CarTypes>();
while (reader.Read()) {
switch (reader.TokenType) {
case JsonTokenType.StartArray:
continue;
case JsonTokenType.EndArray:
goto label;
case JsonTokenType.String:
var v = reader.GetString() is not {} token ? UnreachableException.ThrowWithMessage<string>("JsonTokenType is string but reader.GetString() is null.") : token;
list.Add(EnumDemoCarTypesExtension.TryGetValueByName(
v,
out var item)
? item!.Value : JsonException.ThrowWithMessage<global::EnumDemo.CarTypes>($"Couldn't find \"{v}\" in global::EnumDemo.CarTypes name."));
continue;
default:
continue;
}
}
label:
return list.ToArray();
}

public override void Write(Utf8JsonWriter writer, global::EnumDemo.CarTypes[] arr, JsonSerializerOptions options) {
writer.WriteStartArray();
for (int i = 0, len = arr.Length; i < len; ++i) {
writer.WriteStringValue(arr[i].ToStringFast());
}
writer.WriteEndArray();
}
}

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
public sealed class NullableEnumDemoCarTypesArrayToNameArrayConverter: JsonConverter<global::EnumDemo.CarTypes?[]> {
public override global::EnumDemo.CarTypes?[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
var list = new List<global::EnumDemo.CarTypes?>();
while (reader.Read()) {
switch (reader.TokenType) {
case JsonTokenType.StartArray:
continue;
case JsonTokenType.EndArray:
goto label;
case JsonTokenType.Null:
list.Add(null);
continue;
case JsonTokenType.String:
var v = reader.GetString() is not {} token ? UnreachableException.ThrowWithMessage<string>("JsonTokenType is string but reader.GetString() is null.") : token;
list.Add(EnumDemoCarTypesExtension.TryGetValueByName(
v,
out var item)
? item!.Value : JsonException.ThrowWithMessage<global::EnumDemo.CarTypes>($"Couldn't find \"{v}\" in global::EnumDemo.CarTypes name."));
continue;
default:
continue;
}
}
label:
return list.ToArray();
}

public override void Write(Utf8JsonWriter writer, global::EnumDemo.CarTypes?[] arr, JsonSerializerOptions options) {
writer.WriteStartArray();
for (int i = 0, len = arr.Length; i < len; ++i) {
var v = arr[i];
if (v is null) {
writer.WriteNullValue();
} else {
writer.WriteStringValue(v.Value.ToStringFast());
}
}
writer.WriteEndArray();
}
}

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
public sealed class EnumDemoCarTypesEnumerableToNameEnumerableConverter: JsonConverter<IEnumerable<global::EnumDemo.CarTypes>> {
public override IEnumerable<global::EnumDemo.CarTypes> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
var list = new List<global::EnumDemo.CarTypes>();
while (reader.Read()) {
switch (reader.TokenType) {
case JsonTokenType.StartArray:
continue;
case JsonTokenType.EndArray:
goto label;
case JsonTokenType.String:
var v = reader.GetString() is not {} token ? UnreachableException.ThrowWithMessage<string>("JsonTokenType is string but reader.GetString() is null.") : token;
list.Add(EnumDemoCarTypesExtension.TryGetValueByName(
v,
out var item)
? item!.Value : JsonException.ThrowWithMessage<global::EnumDemo.CarTypes>($"Couldn't find \"{v}\" in global::EnumDemo.CarTypes name."));
continue;
default:
continue;
}
}
label:
return list.ToArray();
}

public override void Write(Utf8JsonWriter writer, IEnumerable<global::EnumDemo.CarTypes> values, JsonSerializerOptions options) {
writer.WriteStartArray();
foreach (var v in values) {
writer.WriteStringValue(v.ToStringFast());
}
writer.WriteEndArray();
}
}

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("TaggedEnum", "1.0")]
public sealed class NullableEnumDemoCarTypesEnumerableToNameEnumerableConverter: JsonConverter<IEnumerable<global::EnumDemo.CarTypes?>> {
public override IEnumerable<global::EnumDemo.CarTypes?> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {
var list = new List<global::EnumDemo.CarTypes?>();
while (reader.Read()) {
switch (reader.TokenType) {
case JsonTokenType.StartArray:
continue;
case JsonTokenType.EndArray:
goto label;
case JsonTokenType.Null:
list.Add(null);
continue;
case JsonTokenType.String:
var v = reader.GetString() is not {} token ? UnreachableException.ThrowWithMessage<string>("JsonTokenType is string but reader.GetString() is null.") : token;
list.Add(EnumDemoCarTypesExtension.TryGetValueByName(
v,
out var item)
? item!.Value : JsonException.ThrowWithMessage<global::EnumDemo.CarTypes>($"Couldn't find \"{v}\" in global::EnumDemo.CarTypes name."));
continue;
default:
continue;
}
}
label:
return list.ToArray();
}

public override void Write(Utf8JsonWriter writer, IEnumerable<global::EnumDemo.CarTypes?> values, JsonSerializerOptions options) {
writer.WriteStartArray();
foreach (var v in values) {
if (v is null) {
writer.WriteNullValue();
} else {
writer.WriteStringValue(v.Value.ToStringFast());
}
}
writer.WriteEndArray();
}
}

Useful

Download Example (.NET C#)

Share TaggedEnum

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

Category "Enum" has the following generators:

1 Aigamo.MatchGenerator Nuget GitHub Repo stars 2026-04-05

2 CredFetoEnum Nuget GitHub Repo stars 2023-10-12

3 EnumClass Nuget GitHub Repo stars 2023-08-08

4 EnumsEnhanced Nuget GitHub Repo stars 2025-08-05

5 EnumUtilities Nuget GitHub Repo stars 2024-04-05

6 Flaggen Nuget GitHub Repo stars 2025-07-23

7 FusionReactor Nuget GitHub Repo stars 2024-04-06

8 Genbox.FastEnum Nuget GitHub Repo stars 2025-08-03

9 jos.enumeration Nuget GitHub Repo stars 2025-07-20

10 NetEscapades.EnumGenerators Nuget GitHub Repo stars 2023-04-16

11 PMart.Enumeration NugetNuget GitHub Repo stars 2025-03-25

12 RapidEnum Nuget GitHub Repo stars 2025-10-04

13 requiredenum Nuget GitHub Repo stars 2025-08-14

14 TaggedEnum Nuget GitHub Repo stars 2026-04-05

See category

Enum