C# не допускает частичной оценки (или вывода) параметров типа для обобщенных c типов или методов (вы можете переключиться на F #, что делает). Таким образом, у вас есть несколько вариантов - вы можете выбрать обобщение по шагам, если вы хотите создать промежуточный класс для запоминания предполагаемого типа, или создать специализации, или вы не можете сделать вывод о типах.
Чтобы сделать это в шаги, вы должны разбить метод ToDto
на две части и использовать промежуточный класс для переноса выведенного типа. Вызовите этот класс Toer
(см. Также этот ответ ):
public class Toer<TModel> {
Model.SharedKernel.BaseModel<TModel> model;
public Toer(Model.SharedKernel.BaseModel<TModel> model) => this.model = model;
public TDto Dto<TDto>() => Globals.mapper.Map<TDto>(model);
}
Теперь вы создаете метод расширения, который возвращает объект Toer
:
public static Toer<TModel> To<TModel>(this Model.SharedKernel.BaseModel<TModel> model) => new Toer<TModel>(model);
Теперь вы можете заменить свой старый код:
var wtDto = warehouseType.ToDto<WarehouseTypeDto, Model.Inventory.WarehouseType>();
На новый код:
var wtDto = warehouseType.To().Dto<WarehouseTypeDto>();
Кроме того, вы можете создать специализации для каждого возможного TModel
:
public static TDto ToDto<TDto>(this Model.SharedKernel.BaseModel<Model.Inventory.WarehouseType> model) => Globals.mapper.Map<TDto>(model);
, который вы можете использовать по своему усмотрению.
Наконец, вы можете специализации, которые предварительно кодируют отображение в соответствующий тип DTO, и использовать их:
public static WarehouseTypeDto ToDto(this Model.SharedKernel.BaseModel<Model.Inventory.WarehouseType> model) => Globals.mapper.Map<WarehouseTypeDto>(model);