Source Generator generating ToString extension methods for any enums.
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
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()
};
}
}