public class WorkingDay : EnumableFlags<Weekday, WorkingDay> { public bool Mon { get; set; } public bool Tue { get; set; } public bool Wed { get; set; } public bool Thu { get; set; } public bool Fir { get; set; } public bool Sat { get; set; } public bool Sun { get; set; } public override int AllFlags { get => GetEnumValue(this); set => SetEnumValue(value, this); } public override Weekday Flags { get => (Weekday)AllFlags; set => AllFlags = (int)value; } } public class Customer: EnumableFlags<CustomerStatus, Customer> { public bool isCreated { get; set; } public bool isDeleted { get; set; } public bool isSuspended { get; set; } public bool isPublished { get; set; } public bool isActive { get; set; } public bool isCleared { get; set; } public bool isTransferable { get; set; } public bool isCommonFlag { get; set; } public int Status { get { int result = 0; result += isCreated ? (int)CustomerStatus.isCreated : 0; result += isDeleted ? (int)CustomerStatus.isDeleted : 0; result += isSuspended ? (int)CustomerStatus.isSuspended : 0; result += isPublished ? (int)CustomerStatus.isPublished : 0; result += isActive ? (int)CustomerStatus.isActive : 0; result += isCleared ? (int)CustomerStatus.isCleared : 0; result += isTransferable ? (int)CustomerStatus.isTransferable : 0; result += isCommonFlag ? (int)CustomerStatus.isCommonFlag : 0; return result; } set { this.isCreated = ((CustomerStatus)value & CustomerStatus.isCreated) == CustomerStatus.isCreated; this.isDeleted = ((CustomerStatus)value & CustomerStatus.isDeleted) == CustomerStatus.isDeleted; this.isSuspended = ((CustomerStatus)value & CustomerStatus.isSuspended) == CustomerStatus.isSuspended; this.isPublished = ((CustomerStatus)value & CustomerStatus.isPublished) == CustomerStatus.isPublished; this.isActive = ((CustomerStatus)value & CustomerStatus.isActive) == CustomerStatus.isActive; this.isCleared = ((CustomerStatus)value & CustomerStatus.isCleared) == CustomerStatus.isCleared; this.isTransferable = ((CustomerStatus)value & CustomerStatus.isTransferable) == CustomerStatus.isTransferable; this.isCommonFlag = ((CustomerStatus)value & CustomerStatus.isCommonFlag) == CustomerStatus.isCommonFlag; } } public override int AllFlags { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public override CustomerStatus Flags { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } } public class CustWithStatus { public int Status { get; set; } public bool isCreated { get { return ((CustomerStatus)this.Status & CustomerStatus.isCreated) == CustomerStatus.isCreated; } } public bool isDeleted { get { return ((CustomerStatus)this.Status & CustomerStatus.isDeleted) == CustomerStatus.isDeleted; } } public bool isSuspended { get { return ((CustomerStatus)this.Status & CustomerStatus.isSuspended) == CustomerStatus.isSuspended; } } public bool isPublished { get { return ((CustomerStatus)this.Status & CustomerStatus.isPublished) == CustomerStatus.isPublished; } } public bool isActive { get { return ((CustomerStatus)this.Status & CustomerStatus.isActive) == CustomerStatus.isActive; } } public bool isCleared { get { return ((CustomerStatus)this.Status & CustomerStatus.isCleared) == CustomerStatus.isCleared; } } public bool isTransferable { get { return ((CustomerStatus)this.Status & CustomerStatus.isTransferable) == CustomerStatus.isTransferable; } } public bool isCommonFlag { get { return ((CustomerStatus)this.Status & CustomerStatus.isCommonFlag) == CustomerStatus.isCommonFlag; } } } public abstract class EnumableFlags<TEnum, T> where TEnum : struct, IComparable, IFormattable, IConvertible where T: class { internal EnumableFlags() { if (!typeof(TEnum).IsEnum) throw new Exception("TEnum must be struct enum"); foreach(Enum x in Enum.GetValues(typeof(TEnum))) { var info = typeof(T).GetProperty(x.ToString()); if (info == null) throw new Exception(string.Format("Class {0} must contain property {1}!", typeof(T).Name, x.ToString())); if (info.PropertyType != typeof(Boolean)) throw new Exception("Properties bind with Enum Flag must be a Boolean Type"); } } internal int GetEnumValue(T value) { int result = 0; foreach (TEnum x in Enum.GetValues(typeof(TEnum))) { var info = value.GetType().GetProperty(x.ToString()); bool b = (bool)info.GetValue(value); int tmp = (int)Enum.Parse(typeof(TEnum), x.ToString()); result += b ? tmp : 0; } return result; } internal void SetEnumValue(object value, T cls) { Enum status = (TEnum)value as Enum; foreach (Enum x in Enum.GetValues(typeof(TEnum))) { var info = cls.GetType().GetProperty(x.ToString()); info.SetValue(cls, status.HasFlag(x)); } } public abstract int AllFlags { get; set; } public abstract TEnum Flags { get; set; } }