オートマッパー:新しいオブジェクトを作成せずにプロパティ値を更新する


260

オートマッパーを使用して、新しいオブジェクトを作成せずに別のオブジェクトのプロパティ値を更新するにはどうすればよいですか?

回答:


456

既存の宛先を受け取るオーバーロードを使用します。

Mapper.Map<Source, Destination>(source, destination);

はい、宛先オブジェクトを返しますが、これは他のあいまいなシナリオの場合のみです。同じオブジェクトです。


28
ありがとう、ジミー...学習曲線がスケジュールに影響を与えるのを恐れていたので、意図的にAutoMapperから離れました。長い間遠ざかっていたことを正式に申し訳ありません...最初に思ったよりもずっと簡単です。
Neil T.

13
Automapperは、最も便利なライブラリの1つでなければなりません。私もそれを長い間避けていました。今日から使い始めて、使いやすさに驚きました。
mcottingham 2013年

4
私のために働かない。同じ型にマッピングしようとすると、新しいオブジェクトが返されます。ユーザーu1、u3 = new User(); u1 =新しいユーザー{Id = 1、NickName = "vami"}; ユーザーu4 = Mapper.Map(u1、u3); Assert.AreEqual(u1.Id、u3.Id); Assert.AreEqual(u1.NickName、u3.NickName);
ペテル2013

7
参考までに、タイプパラメータを指定する必要がないことを発見しました。単純に、Mapper.Map(source、destination)が機能します。素敵でシンプル!
ユダガブリエルヒマンゴ2015

2
NULLの動作はリリース4.2.1で変更されましたか?nullをオブジェクトにマッピングするとnullが返されるようです。一方、2.2.1では、nullを既存のオブジェクトにマッピングすると、既存のオブジェクトが返されました。
Peter McEvoy 2016年

18

これを機能させるには、ソースと宛先のタイプが同じであっても、それらのタイプに対してCreateMapを実行する必要があります。つまりMapper.Map<User, User>(user1, user2); 、このようなマップを作成する必要がある 場合 Mapper.Create<User, User>()


1
ハ!私は同じものを見つけて、受け入れられた回答にコメントを追加しました。私のあなたの説明なしで受け入れられた答えは完全ではありませんが、私のコメントの後、それは最終的にはそうかもしれません:)
Andrzej Martyna

これはすばらしい追加です。ただし、元の質問では、ソースと宛先のタイプについては触れられておらず、同じタイプである必要もありませんでした。
jpaugh 2018

4

受け入れられた回答で使用されている静的メソッドではなく、IMapperのインスタンスメソッドを使用する場合は、以下を実行できます(でテスト済みAutoMapper 6.2.2

IMapper _mapper;
var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Source, Destination>();
});
_mapper = config.CreateMapper();

Source src = new Source
{
//initialize properties
}

Destination dest = new dest
{
//initialize properties
}
_mapper.Map(src, dest);

destsrcこれで、共有されているすべてのプロパティ値で更新されます。その固有のプロパティの値は変わりません。

ここに関連するソースコードがあります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.