簡體   English   中英

如何使用 AutoMapper 從 byte[] 轉換為字符串?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM