Code/SmartEnumExample.cs
using Sandbox;

namespace SmarterEnum;

public class SmartEnumExample : SmartEnum<SmartEnumExample>
{
    [SkipHotload] // this is required
    public static readonly SmartEnumExample A = new("It's is A", nameof(A), 0);
    [SkipHotload] // this is required
    public static readonly SmartEnumExampleB B = new(nameof(B), 1);


    public string Info { get; set; }

    protected SmartEnumExample(string info, string name, int value) : base(name, value)
    {
        Info = info;
    }

    public static void UsingExamples()
    {
        var allValues = SmartEnumExample.Values;

        var bValue = SmartEnumExample.B.Value;
        var aName = SmartEnumExample.A.Name;

        SmartEnumExample.TryFromName("B", out var foundB); // out SmartEnumExample.B
        SmartEnumExample.TryFromValue(0, out var foundA); // out SmartEnumExample.A
        SmartEnumExample.IsDefined(new SmartEnumExampleB(string.Empty, 420)); // false
        SmartEnum.IsSmartEnum(typeof(SmartEnumExampleB)); // true
    }
}

public class SmartEnumExampleB : SmartEnumExample
{
    public SmartEnumExampleB(string name, int value) : base("It's is B", name, value)
    {
    }
}