[英]How can I convert from a byte[] to a string using AutoMapper?
尝试将具有 byte[] 类型属性的 object 转换为具有字符串类型匹配属性的 object 时,我在 AutoMapper 中遇到以下错误:
System.InvalidOperationException:从 System.Byte 到 System.Char 缺少 map。 使用 CreateMap<Byte, Char> 创建。
我尝试使用自定义类型转换器,但它们似乎不起作用(使用或不使用它们都会出现相同的错误)。 我能够 map 特定属性,但我正在尝试创建可以应用于整个项目的东西(我的大多数实体都包含一个旨在用于乐观锁定的 RowVersion)。
我的代码看起来像这样......
public class AutoMapperProfile : AutoMapper.Profile
{
public AutoMapperProfile()
{
CreateMap<byte[], string>().ConvertUsing<ByteArrayToStringTypeConverter>();
CreateMap<string, byte[]>().ConvertUsing<StringToByteArrayTypeConverter>();
CreateMap<MyFirstClass, MySecondClass>();
}
}
public class MyFirstClass
{
public string Name { get; set; }
public byte[] RowVersion { get; set; }
}
public class MySecondClass
{
public string Name { get; set; }
public string RowVersion { get; set; }
}
public class ByteArrayToStringTypeConverter : ITypeConverter<byte[], string>
{
public string Convert(byte[] source, string destination, ResolutionContext context)
{
return System.Convert.ToBase64String(source);
}
}
public class StringToByteArrayTypeConverter : ITypeConverter<string, byte[]>
{
public byte[] Convert(string source, byte[] destination, ResolutionContext context)
{
return System.Convert.FromBase64String(source);
}
}
这是在.Net 5, ASP.Net Core, Web API 项目中。
TypeConverter
在我这边工作正常:
给定这些类:
class DatabaseRecord
{
public byte[] RowVersion { get; set; }
}
class Dto
{
public string RowVersion { get; set; }
}
和这个映射配置
public class Mappings : Profile
{
public static IMapper Mapper = new MapperConfiguration(c => c.AddProfile(new Mappings())).CreateMapper();
public Mappings()
{
CreateMap<string, byte[]>().ConvertUsing<Base64Converter>();
CreateMap<byte[], string>().ConvertUsing<Base64Converter>();
CreateMap<DatabaseRecord, Dto>().ReverseMap();
}
private class Base64Converter : ITypeConverter<string, byte[]>, ITypeConverter<byte[], string>
{
public byte[] Convert(string source, byte[] destination, ResolutionContext context)
=> System.Convert.FromBase64String(source);
public string Convert(byte[] source, string destination, ResolutionContext context)
=> System.Convert.ToBase64String(source);
}
}
@Lucian Bargaoanu指出这可以通过内联转换器缩短:
CreateMap<string, byte[]>().ConvertUsing(s => System.Convert.FromBase64String(s));
CreateMap<byte[], string>().ConvertUsing(bytes => System.Convert.ToBase64String(bytes));
CreateMap<DatabaseRecord, Dto>().ReverseMap();
我可以毫无问题地将string
(base64) 转换为byte[]
并返回:
var result = Mappings.Mapper.Map<Dto>(new DatabaseRecord
{
RowVersion = new byte[]{104,101,108,108,111} // "hello"
});
Console.WriteLine(result.RowVersion); // outputs "aGVsbG8="
var record = Mappings.Mapper.Map<DatabaseRecord>(new Dto
{
RowVersion = "aGVsbG8=" // "hello" in base64
});
// record.RowVersion == 104,101,108,108,111
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.