This is the ideal use case for a new collection type that inherits from List<Employee>
or ObservableCollection<Employee>
. There you can encapsulate the whole logic.
Before you should make your Employee
class more intelligent by a custom event, the collection class wants to know when the property IsResponsiblePerson
was set to true
because then it has to change the old responsible. For example like this:
public class Employee
{
public string Name { get; set; }
public string Surname { get; set; }
public event EventHandler ResponsiblePersonChanged;
private bool _isResponsiblePerson;
public bool IsResponsiblePerson
{
get => _isResponsiblePerson;
set
{
_isResponsiblePerson = value;
if (_isResponsiblePerson)
{
ResponsiblePersonChanged?.Invoke(this, EventArgs.Empty);
}
}
}
}
Now the collection class could be implemented like following, it handles every Employee
's ResponsiblePersonChanged
event:
public class EmployeeCollection : ObservableCollection<Employee>
{
public Employee Responsible { get; private set; }
public EmployeeCollection():base(){}
public EmployeeCollection(IEnumerable<Employee> employees) : base()
{
foreach (Employee e in employees)
{
if (e.IsResponsiblePerson)
{
if(Responsible != null)
throw new ArgumentException("Multiple responsible employees aren't allowed", nameof(employees));
Responsible = e;
}
base.Add(e);
}
}
public new void Add(Employee emp)
{
base.Add(emp);
if (emp.IsResponsiblePerson)
{
MakeResponsible(emp);
}
emp.ResponsiblePersonChanged -= ResponsibleChanged;
emp.ResponsiblePersonChanged += ResponsibleChanged;
}
private void ResponsibleChanged(Object sender, EventArgs e)
{
MakeResponsible(sender as Employee);
}
private void MakeResponsible(Employee employee)
{
if(!employee.IsResponsiblePerson)
throw new ArgumentException("Employee is not responsible but should be", nameof(employee));
if (Responsible != null && !Responsible.Equals(employee))
Responsible.IsResponsiblePerson = false;
Responsible = employee;
}
}
An example:
var list = new EmployeeCollection();
list.Add(new Employee { Name = "1", IsResponsiblePerson = true });
list.Add(new Employee { Name = "2", IsResponsiblePerson = false });
list.Add(new Employee { Name = "3", IsResponsiblePerson = false });
list.Add(new Employee { Name = "4", IsResponsiblePerson = false });
list.Add(new Employee { Name = "5", IsResponsiblePerson = false });
list.Last().IsResponsiblePerson = true; // now the first employee's IsResponsiblePerson is set to false