Skip to content

D4nyi/FastEnumToString

Repository files navigation

FastEnumToString

Source Generator generating ToString extension methods for any enums.

Configure

Global configuration: To set the fallback behaviour if no matching value is found.

<PropertyGroup>
    <FastEnumDefaultBehaviour>Default</FastEnumDefaultBehaviour>
</PropertyGroup>

Or you can use the [ToString] attribute to override the global configuration by calling its parameterized constructor:

[ToString(ToStringDefault.First)]

Available values (for both):

  • Default: Uses the built-in Enum class behaviour and converts the provided value to its numeric representation
  • First: uses the first avalilable enum member,
  • Throw: throwing an ArgumentOutOfRangeException

*the csproj configuration is case insensitive

Example

using FastEnumToString;

using MyNamespace;

Color color = (Color)5;

Console.WriteLine(color);
Console.WriteLine(color.FastToString());
Console.WriteLine(NestingClass<int, List<int>>.NestedInClassEnum.None.FastToString());
Console.WriteLine(EnumStringConverter.FastToString(NestingClass<int, List<int>>.NestedInClassEnum.None));

namespace MyNamespace
{
    public class NestingClass<T, K>
        where T : struct
        where K : class, new()
    {
        [ToString]
        public enum NestedInClassEnum
        {
            None
        }
    }
    
    [ToString(ToStringDefault.First)]
    public enum Color
    {
        Red,
        Green,
        Blue,
    }

    // Flags are not fully supported,
    // only distinct values can be stringified
    [ToString, Flags]
    public enum Devices
    {
        Phone = 1,
        TV = 2,
        Watch = 4,
    }
}

The followning will be generated:

// <auto-generated/>

namespace FastEnumToString
{
    [global::System.CodeDom.Compiler.GeneratedCode("FastEnumToString", "2.0.0")]
    public static class EnumStringConverter
    {
        public static string FastToString<T, K>(this MyNamespace.NestingClass<T, K>.NestedInClassEnum enumValue)
            where T : struct
            where K : class, new()
        => enumValue switch
        {
            MyNamespace.NestingClass<T, K>.NestedInClassEnum.None => nameof(MyNamespace.NestingClass<T, K>.NestedInClassEnum.None),
            _ => ((int)enumValue).ToString()
        };

        public static string FastToString(this MyNamespace.Color enumValue) => enumValue switch
        {
            MyNamespace.Color.Red => nameof(MyNamespace.Color.Red),
            MyNamespace.Color.Green => nameof(MyNamespace.Color.Green),
            MyNamespace.Color.Blue => nameof(MyNamespace.Color.Blue),
            _ => nameof(MyNamespace.Color.Red)
        };

        public static string FastToString(this MyNamespace.Devices enumValue) => enumValue switch
        {
            MyNamespace.Devices.Phone => nameof(MyNamespace.Devices.Phone),
            MyNamespace.Devices.TV => nameof(MyNamespace.Devices.TV),
            MyNamespace.Devices.Watch => nameof(MyNamespace.Devices.Watch),
            _ => ((int)enumValue).ToString()
        };
    }
}

About

Source Generator generating ToString extension methods for any enums

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages