TaggedEnum by Alor'idal
NuGet / site data
Details
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
Author
Alor'idal

Original Readme
cs-lib-template
Al0rid4l's dog food.
About
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)
- CSharp Project
- Program.cs
- CarTypes.cs
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>
This is the use of TaggedEnum in Program.cs
// See https://aka.ms/new-console-template for more information
using EnumDemo;
Console.WriteLine("Hello, World!");
Console.WriteLine(CarTypes.None.ToStringFast());
Console.WriteLine(CarTypes.None.Data);
Console.WriteLine(EnumDemoCarTypesExtension.TryGetValueByName("None",out _));
//Console.WriteLine("Car types:" + CarTypesEnumExtensions.GetValues().Count);
//var cars = CarTypesEnumExtensions.GetValues();
//foreach (var car in cars)
//{
// Console.WriteLine(car.ToStringFast());
//}
This is the use of TaggedEnum in CarTypes.cs
using TaggedEnum;
namespace EnumDemo;
[Tagged]
public enum CarTypes
{
[Data("this is none")]
None,
[Data("this is dacia")]
Dacia,
[Data("this is tesla")]
Tesla,
[Data("this is bwm")]
BMW,
[Data("this is mercedes")]
Mercedes,
}
Generated Files
Those are taken from $(BaseIntermediateOutputPath)\GX
- EnumDemoEnumDemo.CarTypesTaggedEnum.g.cs
- TaggedEnumAttribute.g.cs
// <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();
}
}
// <auto-generated />
#nullable enable
using System.Text.Json;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
namespace TaggedEnum;
internal static class JsonExceptionExtensions {
extension(JsonException) {
[DoesNotReturn]
public static T ThrowWithMessage<T>(string msg)
=> throw new JsonException(msg);
}
}
internal static class UnreachableExceptionExtensions {
extension(UnreachableException) {
[DoesNotReturn]
public static T ThrowWithMessage<T>(string msg)
=> throw new UnreachableException(msg);
}
}
#pragma warning disable CA1050 // Declare types in namespaces
[AttributeUsage(
AttributeTargets.Field,
Inherited = false,
AllowMultiple = false
)]
internal sealed class Data<TValue>(TValue v): Attribute {
public TValue V \{ get; private set; \} = v;
}
[AttributeUsage(
AttributeTargets.Field,
Inherited = false,
AllowMultiple = false
)]
// TValue default is string
internal sealed class Data: Attribute {
public object? V \{ get; }
public Data(object str) {
V = str;
}
public Data() {}
}
#pragma warning restore CA1050 // Declare types in namespaces
#pragma warning disable CA1050 // Declare types in namespaces
[AttributeUsage(
AttributeTargets.Enum,
Inherited = false,
AllowMultiple = false
)]
internal sealed class Tagged<TValue>: Attribute {
public bool Inline = true;
public bool UseSwitch = true;
public bool AllowDuplicate = false;
}
[AttributeUsage(
AttributeTargets.Enum,
Inherited = false,
AllowMultiple = false
)]
// TValue default is string
internal sealed class Tagged: Attribute {
public bool UseAll = false;
public bool Inline = true;
public bool UseSwitch = true;
public bool AllowDuplicate = false;
}
#pragma warning restore CA1050 // Declare types in namespaces
public sealed class DataNotFoundException(string msg): Exception(msg) {
[DoesNotReturn]
public static T ThrowWithMessage<T>(string message) => throw new DataNotFoundException(message);
}
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
2026-04-05
2 CredFetoEnum
2023-10-12
3 EnumClass
2023-08-08
4 EnumsEnhanced
2025-08-05
5 EnumUtilities
2024-04-05
6 Flaggen
2025-07-23
7 FusionReactor
2024-04-06
8 Genbox.FastEnum
2025-08-03
9 jos.enumeration
2025-07-20
10 NetEscapades.EnumGenerators
2023-04-16
11 PMart.Enumeration
2025-03-25
12 RapidEnum
2025-10-04
13 requiredenum
2025-08-14
14 TaggedEnum
2026-04-05