Как реализовать множественные выборы в классе, которые наследуются от Enumeration
С ограничениями?
Если у меня есть пять типов расписаний:
- Фиксированный график
- Повернутое расписание
- Расписание FullTime
- Расписание PartTime
- Гибкое расписание
Первые два варианта - против (Fixed vs Rotated)
, а вторые Два варианта (FullTime vs PartTime)
- против, я имею в виду, что график не может быть fixed
и rotated
одновременно или fulltime and parttime
в то же время , но это может быть Fixed and FullTime
например.
Фиксированные графики работы, которые состоят из одинакового количества часов и дней, отработанных в неделю, и, как правило, остаются неизменными после того, как количество часов и дней было согласовано как работодателем, так и работником.
Гибкие графики работы, в которых работники и работодатели работают вместе, чтобы определить количество часов и дней недели, которые они могут посвятить.
График работы на полный рабочий день, который часто требует от 37 до 40 часов в неделю. Из-за продолжительности рабочего дня карьеры с полной занятостью имеют право на получение пособий по работе. Эти льготы могут включать отпуск, отпуск и болезни, медицинское страхование и различные варианты пенсионного плана.
График работы с частичной занятостью, который является любым графиком, меньшим, чем полная занятость.
Вращающийся график работы, в котором сотрудники работают в течение дня или недели, смены и ночных смен. Этот цикл помогает распределить различные смены между всеми сотрудниками, чтобы никто не застрял только на менее желательных часах.
Итак, я сделал следующее:
public class Schedule
{
public Schedule()
{
}
private ICollection<ScheduleDetail> _assignedWeeks;
public int Id { get; set; }
public string Name { get; set; }
public int WorkingGroupId { get; set; }
public ScheduleType ScheduleType { get; set; }
public bool IsFixed { get; }
public bool IsFlexible { get; }
public bool IsFullTime { get; }
public ICollection<ScheduleDetail> AssignedWeeks { get => _assignedWeeks; set => _assignedWeeks = value; }
}
public abstract class ScheduleType : Enumeration
{
protected ScheduleType(int value, string displayName) : base(value, displayName)
{
}
public static readonly ScheduleType Fixed
= new FixedType();
public static readonly ScheduleType Flexible
= new FlexibleType();
public static readonly ScheduleType FullTime
= new FullTimeType();
public static readonly ScheduleType PartTime
= new PartTimeType();
public static readonly ScheduleType Rotated
= new RotatedType();
private class FixedType : ScheduleType
{
public FixedType() : base(1, "Fixed Work Schedule")
{
}
}
private class FlexibleType : ScheduleType
{
public FlexibleType() : base(2, "Flexible Work Schedule")
{
}
}
private class FullTimeType : ScheduleType
{
public FullTimeType() : base(3, "Full Time Work Schedule")
{
}
}
private class PartTimeType : ScheduleType
{
public PartTimeType() : base(4, "Part Time Work Schedule")
{
}
}
private class RotatedType : ScheduleType
{
public RotatedType() : base(5, "Rotated Work Schedule")
{
}
}
}
public abstract class Enumeration : IComparable
{
private readonly int _value;
private readonly string _displayName;
protected Enumeration()
{
}
protected Enumeration(int value, string displayName)
{
_value = value;
_displayName = displayName;
}
public int Value
{
get { return _value; }
}
public string DisplayName
{
get { return _displayName; }
}
public override string ToString()
{
return DisplayName;
}
public static IEnumerable<T> GetAll<T>() where T : Enumeration, new()
{
var type = typeof(T);
var fields = type.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly);
foreach (var info in fields)
{
var instance = new T();
var locatedValue = info.GetValue(instance) as T;
if (locatedValue != null)
{
yield return locatedValue;
}
}
}
public override bool Equals(object obj)
{
var otherValue = obj as Enumeration;
if (otherValue == null)
{
return false;
}
var typeMatches = GetType().Equals(obj.GetType());
var valueMatches = _value.Equals(otherValue.Value);
return typeMatches && valueMatches;
}
public override int GetHashCode()
{
return _value.GetHashCode();
}
public static int AbsoluteDifference(Enumeration firstValue, Enumeration secondValue)
{
var absoluteDifference = Math.Abs(firstValue.Value - secondValue.Value);
return absoluteDifference;
}
public static T FromValue<T>(int value) where T : Enumeration, new()
{
var matchingItem = parse<T, int>(value, "value", item => item.Value == value);
return matchingItem;
}
public static T FromDisplayName<T>(string displayName) where T : Enumeration, new()
{
var matchingItem = parse<T, string>(displayName, "display name", item => item.DisplayName == displayName);
return matchingItem;
}
private static T parse<T, K>(K value, string description, Func<T, bool> predicate) where T : Enumeration, new()
{
var matchingItem = GetAll<T>().FirstOrDefault(predicate);
if (matchingItem == null)
{
var message = string.Format("'{0}' is not a valid {1} in {2}", value, description, typeof(T));
throw new ApplicationException(message);
}
return matchingItem;
}
public int CompareTo(object other)
{
return Value.CompareTo(((Enumeration)other).Value);
}
}
Таким образом, основываясь на выборе пользователя для конкретной опции или набора опций, мне нужно вызвать метод для установки флагов (IsFixed,...)
в классе Schedule, чтобы управлять классом scheduledetails в (Fixed and rotated) и количеством часов за (полный и неполный рабочий день)
Буду благодарен за любые предложения или рекомендации?