You could use the configuration in MyClass
to handle the different checks:
public class MyClass : IEqualityComparer<Person>
{
// here you set the configuration
private PersonCompareConfiguration personCompareConfiguration;
public bool Equals(Person x, Person y)
{
switch(personCompareConfiguration)
{
case CompareId:
return x.Id == y.Id;
break;
case CompareFirstname:
return x.FirstName == y.FirstName;
break;
}
throw new InvalidArgumentException("personCompareConfiguration cannot be handled");
}
public int GetHashCode(Person obj)
{
switch(personCompareConfiguration)
{
case CompareId:
return obj.Id.GetHashCode();
break;
case CompareFirstname:
return obj.FirstName.GetHashCode();
break;
}
throw new InvalidArgumentException("personCompareConfiguration cannot be handled");
}
}
public enum PersonCompareConfiguration
{
CompareId,
CompareFirstname
}
Another (smarter) way would be to use MEF to export an implementation of IEqualityComparer<Person>
. Have a look at this answer which describes how to export and import generic interfaces.