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)),
};
}
}