Code/SmartEnumComparerAttribute.cs
using System;
using System.Collections.Generic;

namespace SmarterEnum;

[AttributeUsage(AttributeTargets.Class)]
public class SmartEnumComparerAttribute<T> : Attribute
{
    private readonly IEqualityComparer<T> _comparer;

    protected SmartEnumComparerAttribute(IEqualityComparer<T> comparer)
    {
        _comparer = comparer;
    }

    public IEqualityComparer<T> Comparer => _comparer;
}

public class SmartEnumStringComparerAttribute : SmartEnumComparerAttribute<string>
{
    public SmartEnumStringComparerAttribute(StringComparison comparison)
        : base(GetComparer(comparison))
    {
    }

    private static IEqualityComparer<string> GetComparer(StringComparison comparison)
    {
        return comparison switch
        {
            StringComparison.Ordinal => StringComparer.Ordinal,
            StringComparison.OrdinalIgnoreCase => StringComparer.OrdinalIgnoreCase,
            StringComparison.CurrentCulture => StringComparer.CurrentCulture,
            StringComparison.CurrentCultureIgnoreCase => StringComparer.CurrentCultureIgnoreCase,
            StringComparison.InvariantCulture => StringComparer.InvariantCulture,
            StringComparison.InvariantCultureIgnoreCase => StringComparer.InvariantCultureIgnoreCase,
            _ => throw new ArgumentException($"StringComparison {comparison} is not supported", nameof(comparison)),
        };
    }
}