C# 使用AutoMapper映射包装器<;T>;到T';依照惯例

C# 使用AutoMapper映射包装器<;T>;到T';依照惯例,c#,automapper,C#,Automapper,我有一个服务,它将枚举值封装在SafeEnum类型中,以便在不破坏契约的情况下添加新的枚举值 下面是一个例子: public class Customer { public int Id { get; set; } public SafeEnum<CustomerType> Type { get; set; } } public class CustomerModel { public int Id { get; set; } public CustomerMode

我有一个服务,它将枚举值封装在SafeEnum类型中,以便在不破坏契约的情况下添加新的枚举值

下面是一个例子:

public class Customer
{
  public int Id { get; set; }
  public SafeEnum<CustomerType> Type { get; set; }
}

public class CustomerModel
{
  public int Id { get; set; }
  public CustomerModelType Type { get; set; }
}
公共类客户
{
公共int Id{get;set;}
公共安全枚举类型{get;set;}
}
公共类CustomerModel
{
公共int Id{get;set;}
公共CustomerModelType类型{get;set;}
}
使用AutoMapper从客户映射到客户模型时,是否有一种方法可以自动从
SafeEnum
映射到
T'
,其中
T
是包装类型,
T'
是模型中的匹配类型


我知道这可以通过为每个相关的枚举类型进行配置来解决,但我正在寻找一个更优雅的解决方案。

我最近遇到了同样的问题。据我所知,Automapper没有对这种场景提供官方支持(文档中没有提到通用包装器或任何类似的内容,我也找不到任何web资源来说明如何实现),但只需做一点工作就可以完成

首先,您需要创建一个实现
IObjectMapper
接口的类。此接口有两种方法
IsMatch(ResolutionContext上下文)
Map(ResolutionContext上下文,IMappingEngineRunner映射器)

映射两个对象时,Automapper在内部使用
IsMatch
方法确定是否可以使用
IObjectMapper
的给定实例从源类型映射到目标类型。在
ResolutionContext
对象上,您可以使用SourceType、DestinationType、SourceValue、DestinationValue、MappingEngine实例等帮助您确定是否可以使用当前映射器映射这两种类型

Map方法负责两种类型之间的实际映射

因此,在
IsMatch
方法上,您应该检查源类型或目标类型是否是包装类的实例。然后,在
Map
方法中,当从包装的值进行映射时,可以使用反射展开值,并使用ResolutionContext上提供的映射引擎将展开的值映射到其目标类型,然后返回它

类似地,当从任何类型映射到包装类型时,您可以获取封闭泛型包装的类型参数,使用解析上下文中提供的映射引擎从源类型映射到泛型包装所包含的类型,并将结果包装到适当类型的包装类的实例上

最后,在应用程序启动时配置MappingEngine时,您需要包括此映射器(这不适用于mapper类的静态方法,因为您无法更改其上的默认映射器),如下所示:

var configuration = new ConfigurationStore(new TypeMapFactory(), new IObjectMapper[] { new WrapperMapper()}.Union(MapperRegistry.Mappers));
        var engine = new MappingEngine(configuration);    
MapperRegistry.Mappers
static属性是所有默认自动映射器映射器的集合。如果不包括这些,您将丢失所有默认功能

最后,这里有一把小提琴:


它可能需要一些工作来适应您的特定用例,但总体思路是存在的。这可用于包装基本类型、复杂类型或automapper支持的任何类型。

@zespri否,它是CustomerType的模型版本,即具有相同或类似值的另一个枚举类型。我对示例进行了编辑以反映这一点,感谢您指出这一点。(这个例子只是一个例子,它没有反映我拥有的真实类型)