tekitoumemo’s diary

思ったことを書くだけ。長文版Twitter

【C#】テキトーなAutoMapperを作った


AutoMapperがあまり使い勝手良くなかったから自分で作りました。クラスの型が違っててもだいたいマップするよってライブラリ。


メソッド

これだけ(笑)

void Map<T1, T2>(T1 src, T2 dest)
  • T1:コピー元のクラス型
  • T2:コピー先のクラス型
  • src:コピー元のモデル
  • dest:コピー先のモデル

結果はdestにsrcの内容がコピられるってだけです。

使い方

var suitableMapper = new SuitableMapper();
suitableMapper.Map<Test1, Test2>(model1, model2);

どうなるかは以下で説明します。

// Test1クラスのプロパティと値
hoge1 = "TEST1"; // string型
hoge2 = 1; // int型
hoge3 = true; // bool型
hoge4 = new Hoge(){ hoge1 = "OK!"}; / / Hogeクラス型

// Test2クラスのプロパティと値
hoge1 = "TEST2"; // string型
hoge2 = 5; // int型
hoge3 = 10; // int型
hoge4 = null / / Hogeクラス型

// 実行
suitableMapper.Map<Test1, Test2>(model1, model2);

// Test2クラスにコピーされます。
hoge1 = "TEST1"
hoge2 = 1
hoge3 = 10
hoge4 = new Hoge(){ hoge1 = "OK!"}

Test2クラスのhoge3だけは型が違うのでコピーされず、他の3つはTest1クラスのデータがコピーされます。

なぜ作ったか?

AutoMapperは完全に同じクラスじゃないとマッピングしないので、結局手動でマップしたりAutoMapperに型を合わせたりなどいろいろめんどくさいことがあります。画面とデータは対じゃないのでそこの間を吸収出来ないかと思ったことがきっかけです。とりあえず名前と型が一致してたらコピーしちゃえという適当AutoMapperと思ってくれれば良いです。

使えないところ

名前と型が完全に一致してなければダメです。例えばIDとHatenaIDは同じでマップしたくても名前が違うのでダメです。あとクラスは参照型なのでコピーされたらコピー前のデータが残りません。あっあと.NetCoreで作ったので.NetFrameworkでは使えませんが、ソースをコピれば使えます。

注意

テストとかしてないので、使えそうなところを参考程度に見てもらえるとありがたいです。いつかgithubのReadmeもちゃんと書きます。