AutoMapper - コンストラクタを使ってマッピングする

ちょっと発見だったのでメモ。

AutoMapperでは、マッピング先のコンストラクタを呼び出してマッピングすることができます。マッピング先にはpublicなsetterプロパティも必要ありません。

ということでサンプルコード。

モデルとプロファイルを用意して、

// マッピング元
public class SampleSrc {
    public int Id { get; set; }
    public string Value { get; set; }
}

// マッピング先
public class SampleDst {
    // このコンストラクタを使ってマッピングする
    public SampleDst(int id, string value) {
        Console.WriteLine($"{nameof(SampleDst)} constructor({id}, {value})");
        // SampleDst constructor(1, x)

        Id = id;
        Value = value;
    }

    // getterプロパティのみ
    public int Id { get; }
    public string Value { get; }
}

// マッピングのプロファイル
public class SampleProfile : Profile {
    public SampleProfile() {
        CreateMap<SampleSrc, SampleDst>();
    }
}

マッピングします。

// 準備
Mapper.Initialize(config => {
    config.AddProfile<SampleProfile>();
});
Mapper.AssertConfigurationIsValid();

// マッピング元
var src = new SampleSrc {
    Id = 1,
    Value = "x",
};

// SampleSrc => SampleDst
var dst = Mapper.Map<SampleDst>(src);

// 確認
Console.WriteLine(dst.Id);  // 1
Console.WriteLine(dst.Value);   // x

参考