1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C#でAutoMapperを使って別DTOをコピーする

Last updated at Posted at 2023-03-02

1. はじめに

  • WebAPIを使用するとModelとEntityが同じような内容になるのでC#で使えるMapperでコピーしたい
  • 起動時にMapperの設定をまとめて書けるようにしたい

2. 開発環境

  • C#
  • Visual Studio 2022
  • AutoMapper 12.0.1 (NuGet)

3. AutoMapperの取得

  • NuGetpパッケージの管理からAutoMapperをインストールする
    image.png

4. AutoMapperの使用方法

4.1. 単純にマッピングする

  • Book1からBook2へマッピングする
public class Book1 { public int ID { get; set; } }        
public class Book2 { public int ID { get; set; } }

private void Form1_Load(object sender, EventArgs e)
{
    // テストデータ作成
    List<Book1> book1 = new List<Book1>();
    Book1 book11 = new Book1();
    book11.ID = 1;
    book1.Add(book11);
    Book1 book12 = new Book1();
    book12.ID = 2;
    book1.Add(book12);

    // 単純にbook1 → book2にマッピング
    var config = new MapperConfiguration(cfg => cfg.CreateMap<Book1, Book2>());
    var mapper = new Mapper(config);
    List<Book2> book2 = mapper.Map<List<Book2>>(book1);

    // デバッグ用
    book2.ForEach(x => Debug.Print(x.ID.ToString()));
}
  • 実行結果
    image.png

4.2. 値を除外する

  • IDの項目をマッピングから除外する
  • Ignoreメソッドを使用する
    // book1 → book2にマッピング(IDを除外)
    var config = new MapperConfiguration(cfg => cfg.CreateMap<Book1, Book2>()
        .ForMember(book1 => book1.ID,
        option => option.Ignore())
    );
  • 実行結果
    image.png

4.3. 値を編集する

  • IDの値を2倍に編集する
  • MapFromメソッドを使用する
    // book1 → book2にマッピング(IDの値を2倍に編集)
    var config = new MapperConfiguration(cfg => cfg.CreateMap<Book1, Book2>()
        .ForMember(book1 => book1.ID,
        option => option.MapFrom(x => x.ID * 2))
    );
  • 実行結果
    image.png

4.4. 型違いをコピーする

  • 試しにBook1のintのID → Book2のstringのIDへコピーする
  • 型が違っても上記のプロパティが同じであれば同じマッピング設定でコピーできている
    public class Book1 { public int ID { get; set; } }        
    public class Book2 { public string ID { get; set; } }

    // 単純にbook1 → book2にマッピング (4.1.と同じ)
    var config = new MapperConfiguration(cfg => cfg.CreateMap<Book1, Book2>());
    var mapper = new Mapper(config);
    List<Book2> book2 = mapper.Map<List<Book2>>(book1);

5. AutoMapperの起動時設定

5.1. Profileの作成

  • AutoMapperのProfieクラスを継承してマッピング設定をまとめて書く
UserProfile
using AutoMapper;
public class UserProfile:Profile
{
    public UserProfile()
    {
        // マッピング設定をまとめて書く
        CreateMap<Book1, Book2>()
            .ForMember(book2 => book2.ID,   // IDを編集する
            option => option.MapFrom(x => x.ID*2));
    }
}

5.2. Profileの読み込み(起動時)

  • 起動時にまとめてProfileを読み込む
private void Form1_Load(object sender, EventArgs e)
{
    // テストデータ作成
    // (省略)

    // マッピング設定を読み込む
    var mapperConfig = new MapperConfiguration(mc =>
    {
        mc.AddProfile(new UserProfile());
    });
    IMapper mapper = mapperConfig.CreateMapper();

    // マッピングをする
    List<Book2> book2 = mapper.Map<List<Book2>>(book1);

    // デバッグ用
    book2.ForEach(x => Debug.Print(x.ID.ToString()));
}

6. 参考文献

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?