如何使用AutoMapper实现byte[]到string的全局类型转换?
问题原因
AutoMapper默认将byte[]识别为IEnumerable<byte>集合类型、将string识别为IEnumerable<char>集合类型,会优先触发集合元素的逐个映射逻辑,尝试把单个byte转成char,因此不会触发你配置的byte[]到string的整体类型转换器,才会抛出缺少Byte到Char映射的错误。
解决方案
有两种方案可以实现全局生效的byte[]与string互转,不需要逐个属性配置:
方案1:添加全局属性映射规则(推荐)
在你的AutoMapperProfile构造函数中,添加全局属性匹配规则,遇到源为byte[]、目标为string的属性时,直接使用你已经写好的类型转换器进行转换,修改后的Profile代码如下:
public class AutoMapperProfile : AutoMapper.Profile { public AutoMapperProfile() { // 全局配置:所有源类型为byte[]、目标类型为string的属性,都用ByteArrayToStringTypeConverter转换 ForAllPropertyMaps(pm => pm.SourceType == typeof(byte[]) && pm.DestinationType == typeof(string), (pm, c) => c.ConvertUsing<ByteArrayToStringTypeConverter, byte[]>()); // 全局配置:所有源类型为string、目标类型为byte[]的属性,都用StringToByteArrayTypeConverter转换 ForAllPropertyMaps(pm => pm.SourceType == typeof(string) && pm.DestinationType == typeof(byte[]), (pm, c) => c.ConvertUsing<StringToByteArrayTypeConverter, string>()); CreateMap<MyFirstClass, MySecondClass>(); // 其他实体映射不用额外修改,自动适配RowVersion字段的转换 } }
该方案无需修改你已经实现的类型转换器,所有实体的byte[]和string对应属性都会自动走转换逻辑,不需要逐个属性配置。
方案2:修改AutoMapper全局配置,禁用string的集合映射识别
在注册AutoMapper的时候,修改全局配置,禁止AutoMapper将string当做IEnumerableCreateMap<byte[], string>().ConvertUsing规则就可以正常生效:
// 注册AutoMapper时的配置示例,ASP.NET Core中放在Program.cs/Startup.cs builder.Services.AddAutoMapper(cfg => { // 禁止byte[]和string之间走集合元素映射逻辑 cfg.Internal().EnumerableToEnumerableMapping.EnabledForTypes = (source, dest) => dest != typeof(string) && source != typeof(byte[]); }, typeof(AutoMapperProfile));
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

