簡體   English   中英

如何在 C# 中使用 Automapper 將 map 陣列到陣列

[英]How to map array to array using Automapper in C#

我有以下源和目標 class。

public class Source
    {
        public string BookName { get; set; }
        public Bookstore[] BookStore { get; set; }
    }

    public class Bookstore
    {
        public Address[] Address { get; set; }
    }

    public class Address
    {
        public string Street { get; set; }
    }

目標 class 如下

public class Target

    {
        public string Book { get; set; }
        public Store[] Store { get; set; }
    }
    public class Store
    {
        public Geo Geo { get; set; }
    }

    public class Geo
    {
        public Location[] Location { get; set; }
    }

    public class Location
    {
        public string Street { get; set; }
    }

我正在尋找正確映射的解決方案,其中源文件數據被復制到如下目標字段,

CreateMap<Source, Target>()
                .ForMember(dest => dest.Book, o => o.MapFrom(src => src.BookName));
               
CreateMap<Bookstore, Store>()
                .ForMember(dest => dest.Geo.Location, o => o.MapFrom(src => src.Address));

但是我看到一些錯誤,例如“解析為頂級成員”等或數組字段,地理和位置仍然為空。

我想將 map 源數據發送到目的地。

下面是一個源文件示例

var jsonText = @"                      
{
  "BookName": "Test",
  "BookStore": [
    {
      "Address": [
        {
          "Street": "1234"
        }
      ]
    }
  ]
}";


            var sourType = JsonConvert.DeserializeObject<Source>(jsonText);

預期的目標文件如下,其中添加了“Geo”object,

{
  "Book": "Test",
  "Store": [
    {
      "Geo": {
        "Location": [
          {
            "Street": "1234"
          }
        ]
      }
    }
  ]
}

對於這種類型的包裝,您需要一個自定義轉換器。 盡管根據您的 model,您的 JSON 結果應該是這樣的:

{
  "Book": "Test",
  "Store": [
    {
      "Geo": {
        "Location": [
          {
            "Street": "1234"
          }
        ]
      }
    }
  ]
}

順便說一句,這是解決方案:

Expression < Func < Bookstore, Store >> storeConverter = p => (new Store {
  Geo = new() {
    Location = p.Address
      .Select(ad => new Location {
        Street = ad.Street
      }).ToArray()
  }
});

CreateMap < Source, Target > ()
  .ForMember(dest => dest.Book, o => o.MapFrom(src => src.BookName))
  .ForMember(dest => dest.Store, o => o.MapFrom(src => src.BookStore));

CreateMap < Bookstore, Store > ()
  .ConvertUsing(storeConverter);

您可以在單獨的 class 類型的轉換器中移動表達式以獲得更簡潔的代碼。 請參閱文檔https://docs.automapper.org/en/stable/Custom-type-converters.html中的詳細信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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