using System; using System.ComponentModel.DataAnnotations; using System.Linq; using Kreta.Naplo.Domain.V3.UniqueIdentifier; namespace Kreta.Naplo.Domain.V3.Adatszotar { [Serializable] public class Adatszotar where T : System.Enum { private string _leiras; public Adatszotar(int id) { Uid = new AdatszotarUid(id, GetEnumName(id)); } public Adatszotar(int id, string leiras) { Uid = new AdatszotarUid(id, GetEnumName(id)); Leiras = leiras; } public Adatszotar(string leiras) { Uid = new AdatszotarUid(0, GetEnumName(0)); Leiras = leiras; } public Adatszotar(string nev, string leiras) { Uid = new AdatszotarUid(0, nev); Leiras = leiras; } public string EnumTypeFullName => typeof(T).Name; public string EnumTypeName => EnumTypeFullName.Replace("Enum", string.Empty).Replace("enum", string.Empty); public static bool IsAdatszotarElem(int id) => id >= Constant.EgyedilegFelvettAdatSzotarElemStartIndex && string.IsNullOrWhiteSpace(System.Enum.GetName(typeof(T), id)); public string Leiras { get => _leiras ?? GetDisplayNameAttribute(); private set => _leiras = value; } public AdatszotarUid Uid { get; private set; } private string GetEnumName(int id) => id == 0 ? $"{typeof(T)}_{nameof(Enum.Adatszotar.IsmeretlenErtek)}" : IsAdatszotarElem(id) ? nameof(Enum.Adatszotar.AdatszotarElem) : System.Enum.GetName(typeof(T), id); public override bool Equals(object obj) => obj is Adatszotar @enum && Uid.Id == @enum.Uid.Id; public T GetEnum() => (T)System.Enum.Parse(typeof(T), Uid.Nev); public override int GetHashCode() => 2_108_858_624 + Uid.Id.GetHashCode(); private string GetDisplayNameAttribute() { if (string.IsNullOrWhiteSpace(Uid.Nev)) { return null; } var fieldInfo = typeof(T).GetField(Uid.Nev); if (fieldInfo != null) { var attributes = (DisplayAttribute)fieldInfo.GetCustomAttributes(typeof(DisplayAttribute), false).FirstOrDefault(); if (attributes != null) { return attributes.GetName(); } } return null; } public static implicit operator Adatszotar(int id) => new Adatszotar(id); public static implicit operator Adatszotar(T enumValue) => new Adatszotar(Convert.ToInt32(enumValue)); public static bool operator !=(Adatszotar lhsWrapper, T rhsEnum) => IsAdatszotarElem(lhsWrapper.Uid.Id) || !lhsWrapper.GetEnum().Equals(rhsEnum); public static bool operator ==(Adatszotar lhsWrapper, T rhsEnum) => !IsAdatszotarElem(lhsWrapper.Uid.Id) && lhsWrapper.GetEnum().Equals(rhsEnum); } }