У меня есть такой интерфейс:
public interface IImportModel
{
}
И класс, который реализует этот интерфейс:
public class MaterialImportModel: IImportModel
{
public string Name { get; set; }
}
Также у меня есть интерфейс для процессоров импорта:
public interface IImportProcessor<TModel> where TModel: IImportModel
{
void Process(TModel model);
}
И есть одна из реализаций этого интерфейса:
public class MaterialImportProccessor : IImportProcessor<MaterialImportModel>
{
public void Process(MaterialImportModel model)
{
// do some logic here
}
}
Теперь я хочу создать Factory для создания экземпляров таких процессоров. У меня есть интерфейс:
public interface IImportProcessorFactory
{
IImportProcessor<IImportModel> Get(Parameter parameter);
}
И я пытаюсь создать реализацию:
public class ImportProcessorFactory : IImportProcessorFactory
{
public IImportProcessor<IImportModel> Get(Parameter parameter)
{
switch (Parameter)
{
case "Materials":
IImportProcessor<IImportModel> processor = new MaterialImportProccessor();
return processor;
case "Companies":
IImportProcessor<IImportModel> processor = new CompaniesImportProccessor();
return processor;
}
}
}
Но я получил исключение:
Ошибка CS0266 Не удается неявно преобразоватьвведите 'MaterialImportProccessor' в IImportProcessor<IImportModel>
. Существует явное преобразование (вам не хватает приведения?)
Это правильно. Но я не могу использовать ключевое слово out
для создания IImportProcessor
ковариации, потому что я использую TModel
в качестве входного параметра метода Process(TModel method)
.
Есть ли способы реорганизовать этот код, чтобы он работал?
РЕДАКТИРОВАНИЕ
Я решил предоставить дополнительную информацию о том, как я планирую использовать эту фабрику.
var deserializer = _deserializerFactory.Get(/*some parameters*/);
var importProcessor = _importProcessorFactory.Get(someEunmValue);
var data = deserializer.Deserialize(file);
importProcessor.Process(data);
Из-за этого я не могу сделать фабрику процессора импорта общей.