namespace ExpenseTracker.Domain.Enums; using System.Reflection; public abstract class Enumeration : IEquatable> where TEnum : Enumeration { public static Dictionary Enumerations { get; private set; } = CreateEnumerations(); protected Enumeration(int value, string name) { Value = value; Name = name; } public int Value { get; protected init; } public string Name { get; protected init; } = string.Empty; public static TEnum? FromValue(int value) { return Enumerations.TryGetValue(value, out TEnum? enumeration) ? enumeration : default; } public static TEnum? FromName(string name) { return Enumerations.Values.SingleOrDefault(v => v.Name == name); } public bool Equals(Enumeration? other) { if (other is null) { return false; } return GetType() == other.GetType() && Value == other.Value; } public override bool Equals(object? obj) { return obj is Enumeration other && Equals(other); } public override int GetHashCode() { return Value.GetHashCode(); } public override string ToString() { return Name; } private static Dictionary CreateEnumerations() { var enumerationType = typeof(TEnum); var fieldsForType = enumerationType .GetFields( BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy) .Where(fieldInfo => enumerationType.IsAssignableFrom(fieldInfo.FieldType)) .Select(fieldInfo => (TEnum) fieldInfo.GetValue(default)!); return fieldsForType.ToDictionary(x => x.Value); } }