【发布时间】:2020-03-06 19:49:17
【问题描述】:
我的领域模型类继承自:
BaseModel<T>
例如:
public partial class WarehouseType : BaseModel<WarehouseType>
{}
我正在尝试将扩展方法添加到 BaseModel 为:
public static class BaseModelExtensionMethods
{
public static TDto ToDto<TDto, TModel>(this Model.SharedKernel.BaseModel<TModel> model)
{
return Globals.mapper.Map<TDto>(model);
}
}
这就是我使用它的方式:
Model.Inventory.WarehouseType warehouseType = new Model.Inventory.WarehouseType();
warehouseType.ToDto<V1.Messages.WarehouseTypeDto, Model.Inventory.WarehouseType>();
如上面的代码所示,我需要将两种类型(TDto,TModel)传递给ToDto<>扩展方法。
我想知道是否可以以不需要将TModel 传递给ToDto<> 并在方法中获取TModel 类型的方式修改 ToDto 语法,例如根据到调用扩展方法的对象类型?有什么解决方法或魔法可以做这样的事情吗?我需要这个,以便代码变得更干净和更易于使用。
我正在寻找的理想语法如下:
warehouseType.ToDto<V1.Messages.WarehouseTypeDto>();
【问题讨论】:
-
您可以添加一个虚拟参数来推断
TDto类型,因为您必须推断所有类型或明确指定所有类型。public static TDto ToDto<TDto, TModel>(this Model.SharedKernel.BaseModel<TModel> model, TDto dummyToInferType)或者,您可以在BaseModel<TModel>上创建ToDto<TDto>方法 -
@juharr 我看不出我应该如何调用您提供的方法。也不能像我的问题中的理想语法那样称呼它。
-
@juharr BaseModel
在我的域模型层中,我试图在域模型层之上的 ESB 层内扩展它,而 Dtos 在 ESB 层内,所以我无法从域模型层引用 ESB 层。 -
是否需要扩展方法?您可以将您的方法添加到 BaseModel 吗?如果您想将代码放在不同的文件中,可以使用部分类。
-
@Alex-TinLe 它不一定是扩展方法,但我希望它是一个。由于 BaseModel 在域模型层内,如果我将此方法添加到 BaseModel 类,那么我需要将 IMapper 注入到域模型层,我更喜欢目前有点难使用的语法,而不是这种 DI 方法。我知道部分类,并且我在域模型层中有它们,但这不是我想要做的。
标签: c# generics extension-methods