В методе, когда у вас есть переключатели или конструкции if / else для определения способа отправки методов, это явный признак того, что вы не используете полиморфизм.
Одним из решений было бы сделать Audit () виртуальным методом EntityBase и заставить Audit вызывать его в экземплярах (поэтому вы переопределяете Audit в Customer или Car)
Вы можете в качестве бонуса предоставить реализацию по умолчанию, используя отражение, которое проходит через каждое свойство унаследованного класса для его выгрузки.
public abstract class EntityBase
{
protected void Create(EntityBase c)
{
Audit(c);
}
public virtual void Audit()
{
//Default audit code here, using reflection for instance
}
}
public class Car : EntityBase
{
//Does not override, uses default Audit Code
}
public class Hamster : EntityBase
{
public override void Audit()
{
//Specific code here..
}
}
Если вы не хотите, чтобы ответственность за Аудит находилась внутри класса Entity или одного из его наследников, вам придется пойти по пути отражения.