У меня есть универсальная функция, которая получает интерфейс как тип, теперь в одном условии я должен создать новый класс в зависимости от интерфейса. Я думал об этом, и одним из способов решения этой проблемы было бы использование IoC, но я надеялся, что будет другой путь, потому что IoC выглядит как избыточное убийство.
ниже - попытка использования шаблона посетителя:
public class RepositoryManager<T> : IRepositoryManager<T> where T : class, new()
{
public T GetOrCreate(string id)
{
T item = (T)CreateNew(new T(), id);
return item;
}
}
Если бы вместо интерфейса я получал объект, я мог бы использовать шаблон посетителя, чтобы выяснить, какой класс создать, но я не могу понять это в зависимости от предоставленного интерфейса.
У меня была еще одна идея, могу ли я сделать объявление where как или?
public class RepositoryManager<T> : IRepositoryManager<T> where T : class, Iabc or Ixyz, new()
Надеюсь, вопрос ясен:)
-Марк
Спасибо за ответ.
Проблема в том, что метод может иметь много разных интерфейсов, например:
Класс RepositoryManager:
private static IMedicament CreateNew(IMedicament emptyType, string id)
{
return new Medicament { Id = id };
}
private static IRefund CreateNew(IRefund emptyType, string id)
{
return new Refund { Id = id };
}
RepositoryManager<Iabc> abcRepository = new RepositoryManager<Iabc>();
RepositoryManager<Ixyz> xyzRepository = new RepositoryManager<Ixyz>();
Iabc abc = abcRepository.GetOrCreate("12345");
Ixyz xyz = xyzRepository.GetOrCreate("12345");
, поэтому использование T item = (T)CreateNew(new T(), id);
не будет работать, потому что я должен сказать, что T может быть типа Iabc или Ixyz, но когда я это делаю, я получаю следующую ошибку:
Вызов неоднозначен между следующими методами или свойствами: RepositoryManager<T>.CreateNew(IMedicament, string)
и RepositoryManager<T>.CreateNew(IRefund, string)
Было бы неплохо, если бы я заработал на этом, кроме простого копирования кода несколько раз.