Я использую Entity Framework и имею объекты PERSON, которые содержат несколько объектов EMAIL и PHONE. При обновлении человека у меня есть вспомогательный метод, который обновляет адреса и вспомогательный метод, который обновляет адреса электронной почты. Я не могу найти хороший способ устранить все дублирование кода между ними. Моя первая мысль заключалась в использовании дженериков, но я не могу придумать, как это сделать, когда я бы не закончил слишком сложный метод, который бы уменьшил читаемость больше, чем увеличил бы ремонтопригодность. Спасибо!Как слить эти два аналогичных метода
private void HandleEmailUpdate(PERSON personEntity, string emailType, string newValue)
{
var emailEntity = personEntity.EMAILs.FirstOrDefault(h => h.EMAIL_TYPE == emailType);
if (emailEntity == null)
{
if (string.IsNullOrEmpty(newValue))
return;
var newEmail = new EMAIL
{
EMAIL_TYPE = emailType,
EMAIL_ADDR = newValue,
SSN = personEntity.SSN,
PID = personEntity.PID
};
personEntity.EMAILs.Add(newEmail);
_context.Entry(newEmail).State = EntityState.Added;
}
else if (emailEntity.EMAIL_ADDR != newValue)
{
if (newValue == "")
{
_context.Entry(emailEntity).State = EntityState.Deleted;
}
else
{
_context.Entry(emailEntity).CurrentValues.SetValues(new {EMAIL_ADDR = newValue});
_context.Entry(emailEntity).State = EntityState.Modified;
}
}
}
private void HandlePhoneUpdate(PERSON personEntity, string phoneType, string newValue)
{
var phoneEntity = personEntity.PHONEs.FirstOrDefault(h => h.PHONE_TYPE == phoneType);
if (phoneEntity == null)
{
if (string.IsNullOrEmpty(newValue))
return;
var newPhone = new PHONE
{
PHONE_TYPE = phoneType,
PHONE1 = newValue,
SSN = personEntity.SSN,
PID = personEntity.PID
};
personEntity.PHONEs.Add(newPhone);
_context.Entry(newPhone).State = EntityState.Added;
}
else if (phoneEntity.PHONE1 != newValue)
{
if (newValue == "")
{
_context.Entry(phoneEntity).State = EntityState.Deleted;
}
else
{
_context.Entry(phoneEntity).CurrentValues.SetValues(new {PHONE1 = newValue});
_context.Entry(phoneEntity).State = EntityState.Modified;
}
}
}
Использование: (I цензурой из названия с 'XXX')
HandlePhoneUpdate(entity, "ALT", updatedPerson.PhoneAlt);
HandlePhoneUpdate(entity, "CELL", updatedPerson.PhoneCellWork);
HandlePhoneUpdate(entity, "SECOND_CELL", updatedPerson.PhoneCellPersonal);
HandlePhoneUpdate(entity, "xxx", updatedPerson.Phonexxx);
HandlePhoneUpdate(entity, "HOME", updatedPerson.PhoneHome);
HandlePhoneUpdate(entity, "WORK", updatedPerson.PhoneWork);
HandleEmailUpdate(entity, "ALT", updatedPerson.EmailAlt);
HandleEmailUpdate(entity, "xxx", updatedPerson.Emailxxx);
HandleEmailUpdate(entity, "HOME", updatedPerson.EmailPersonal);
HandleEmailUpdate(entity, "xxx", updatedPerson.Emailxxx);
HandleEmailUpdate(entity, "WORK", updatedPerson.EmailWork);
методы расширения будут удалены из параметров, таких как 'public void HandleSomething (этот человек PERSON, строка phoneType, строка newVal)' then call это как 'person.HandleSomething (" asd "," asdf "); 'и вы можете сделать это как' public void HandeSomething (этот PERSON, string Type, string newVal) {if (T is Phone) {...} else if (T is Email)} ' –
Lucas
Если классы EMAIL и PHONE не Не разделяйте базовый класс, тогда я не вижу, как вы можете объединить код и сохранить читаемость и техническую поддержку в одно и то же время без использования дженериков. – Ma3x