为了账号安全,请及时绑定邮箱和手机立即绑定

AutoMapper 中的自定义对象到字符串映射器

AutoMapper 中的自定义对象到字符串映射器

C#
30秒到达战场 2021-05-31 08:58:29
使用 AutoMapper(v6.2.2,加上AutoMapper.Extensions.Microsoft.DependencyInjection)我想使用我现有的系统TypeConverter类将某些数据模型转换为字符串。尽管内部MapperRegistry包含 aTypeConverterMapper应该能够自动执行此操作(无需此处所说的任何手动配置),StringMapper但当目标类型为 a 时,它永远不会因为优先而被调用string。其他(较旧的)答案建议更改 中的映射对象MapperRegistry,但似乎已经创建了此类internal。我可以在 AutoMapper 中更改(或删除)不同的内置映射器类的优先级吗?作为一种解决方法,我还尝试在 myProfile中创建一个映射,尝试使用类型转换器将任何对象转换为字符串:private class ApiTypeConverter : ITypeConverter<object, string>{     public string Convert(object source, string destination, ResolutionContext context)     {        TypeConverter sourceTypeConverter = TypeDescriptor.GetConverter(source.GetType());        if (sourceTypeConverter.CanConvertTo(typeof(string)))        {           return (string)sourceTypeConverter.ConvertTo(source, typeof(string));        }        return default(string);     }}我配置为用于:CreateMap<object, string>().ConvertUsing<ApiTypeConverter>();但这也没有按预期工作。理想情况下,我只会对可以使用条件转换的成员执行此操作,例如:ForAllMaps((m, e) => e.ForAllMembers(opt => opt.Condition(HasConverter))                      .ConvertUsing<ApiTypeConverter>());但是,这是不可能的(该ForAllMembers方法返回void)。当我使用AutoMapper.Extensions.Microsoft.DependencyInjection 时,我能够使用additionalInitAction参数来更改映射器:services.AddAutoMapper(InitAction, GetType().Assembly);private void InitAction(IMapperConfigurationExpression configuration){    var mapper = configuration.Mappers.OfType<StringMapper>().First();    configuration.Mappers.Remove(mapper);}这导致一切按预期工作,但似乎有点黑客,因为其他地图可能依赖于StringMapper.
查看完整描述

2 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

您可以使用configuration.Mappers来更改内置映射器的列表,但从对象到字符串的映射也应该可以工作。


Mapper.Initialize(cfg =>

{

    var mappers = cfg.Mappers;

});


查看完整回答
反对 回复 2021-06-05
?
开满天机

TA贡献1786条经验 获得超13个赞

如果使用依赖注入,则可以在将 AutoMapper 添加到服务时更改配置:


services.AddAutoMapper(InitializeMapper, typeof(Startup).Assembly);

然后添加适当的初始化:


private static void InitializeMapper(IMapperConfigurationExpression cfg)

{

    StringMapper stringMapper = cfg.Mappers.OfType<StringMapper>().First();

    int index = cfg.Mappers.IndexOf(stringMapper);


    cfg.Mappers.Insert(index, new CustomObjectMapper());

}


查看完整回答
反对 回复 2021-06-05
  • 2 回答
  • 0 关注
  • 201 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信