У меня есть общая функция, которая получает интерфейс как тип, теперь в одном условии мне нужно создать новый класс в зависимости от интерфейса. Я думал об этом, и способ решить это будет использовать IoC, но я надеялся, что будет другой путь, потому что IoC кажется немного переполненным.C# - создать экземпляр класса в зависимости от предоставленного интерфейса в общем классе
ниже является попыткой использования шаблона посетителя:
public class RepositoryManager<T> : IRepositoryManager<T> where T : class, new()
{
public T GetOrCreate(string id)
{
T item = (T)CreateNew(new T(), id);
return item;
}
}
Если вместо интерфейса я получаю объект, то я мог бы использовать паттерн посетитель, чтобы выяснить, какой класс инстанцировать, но я не могу чтобы понять это в зависимости от предоставленного интерфейса.
Другая идея, которую я имел, заключалась в том, могу ли я сделать объявление где-то вроде или?
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)
Было бы неплохо, если бы я получил эту работу, просто скопировав код несколько раз.
Я не понимаю, в чем ваш вопрос. Что ты пытаешься сделать? Напишите метод, который принимает интерфейс как тип (параметр?) И создает класс, который реализует интерфейс? (Это потребует реестр или поиск в поиске.) Или что-то еще? – 2008-11-20 00:29:07