Как вы ожидаете сделать его универсальным, если ваш метод содержит специфичные для типа операции?У вас всегда есть сущность XXX и класс XXXData, где сущность XXX содержит Id
и Name
, а класс XXXData содержит Name
и Id
?Если бы не ваше общее сохранение, это был бы просто шаблон, принимающий делегатов для конкретного метода = без упрощения.Если да, вы можете сделать что-то вроде:
Сначала подготовьте интерфейс, используемый в универсальных методах:
public interface IData
{
int Id { get; }
string Name { get; set; }
}
Теперь реализуйте этот интерфейс в вашей сущности и классах данных и создайте универсальный метод:
internal static void Save<TEntity, TData>(TData data)
where TEntity : class, IData
where TData : class, IData
{
using (CFOEntityModelContainer database = new CFOEntityModelContainer())
{
ObjectSet<TEntity> set = database.CreateObjectSet<TEntity>();
// Here you have specific method - can you make it generic?
// If not it must be another parameter (delegate) passed to Save method
if (!IsValid(data.Id))
{
// Convert is another specific method which must be generalize
// This time it can be probably solved by overriding conversion
// operator on each data implementation
set.AddObject(Convert(data));
}
else
{
// Another specific logic - can you make it generic?
// If not it must be passed as delegate
TEntity entity = set.First(e => e.Id == data.Id);
entity.Name = data.Name;
}
database.SaveChanges();
}
}
Вы можете вызвать этот метод как:
Save<Client, ClientData>(data);