Automapper: อัปเดตค่าคุณสมบัติโดยไม่ต้องสร้างวัตถุใหม่


260

ฉันจะใช้ automapper เพื่ออัปเดตค่าคุณสมบัติของวัตถุอื่นโดยไม่ต้องสร้างใหม่ได้อย่างไร

คำตอบ:


456

ใช้เกินที่ใช้ปลายทางที่มีอยู่:

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

ใช่มันจะส่งคืนวัตถุปลายทาง แต่เป็นเพียงสถานการณ์จำลองอื่น ๆ ที่คลุมเครือ มันเป็นวัตถุเดียวกัน


28
ขอบคุณ Jimmy ... ฉันตั้งใจจะอยู่ห่างจาก AutoMapper เพราะฉันกลัวว่าช่วงการเรียนรู้จะส่งผลกระทบต่อตารางเวลาของฉัน ฉันขอโทษอย่างเป็นทางการฉันอยู่ห่าง ๆ ... มันง่ายกว่าที่ฉันคิดไว้ในตอนแรก
Neil T.

13
Automapper ต้องเป็นหนึ่งในห้องสมุดที่มีประโยชน์ที่สุด ฉันหลีกเลี่ยงมันเป็นเวลานานเกินไปนานเกินไป ฉันเริ่มใช้มันวันนี้และฉันประหลาดใจมากที่ใช้งานง่าย
mcottingham

4
ไม่ได้ผลสำหรับฉัน ฉันพยายามแมปเป็นประเภทเดียวกัน แต่กลับเป็นวัตถุใหม่ ผู้ใช้ u1, u3 = ผู้ใช้ใหม่ (); u1 = ผู้ใช้ใหม่ {Id = 1, NickName = "vami"}; ผู้ใช้ u4 = Mapper.Map (u1, u3); Assert.AreEqual (u1.Id, u3.Id); Assert.AreEqual (u1.NickName, u3.NickName);
Péter

7
FYI ฉันค้นพบว่าคุณไม่จำเป็นต้องระบุพารามิเตอร์ประเภท เพียงแค่ Mapper.Map (แหล่งที่มาปลายทาง) จะทำงาน ดีและเรียบง่าย!
Judah Gabriel Himango

2
พฤติกรรม NULL มีการเปลี่ยนแปลงในรุ่น 4.2.1? ฉันเห็นว่าการจับคู่ null เป็นวัตถุส่งคืน null 2.2.1 ในขณะที่การทำแผนที่เป็นโมฆะวัตถุที่มีอยู่กลับวัตถุ
Peter McEvoy

18

เพื่อให้งานนี้คุณต้อง CreateMap สำหรับประเภทของแหล่งที่มาและปลายทางแม้จะเป็นประเภทเดียวกัน หมายความว่าถ้าคุณต้องการ Mapper.Map<User, User>(user1, user2); คุณต้องสร้างแผนที่แบบนี้ Mapper.Create<User, User>()


1
ฮา! ฉันเพิ่งพบสิ่งเดียวกันและเพิ่มความคิดเห็นในคำตอบที่ยอมรับแล้ว IMHO คำตอบที่ได้รับการยอมรับโดยไม่มีคำอธิบายของคุณไม่สมบูรณ์ แต่หลังจากความคิดเห็นของฉันมันอาจเป็นไปได้ในที่สุด :)
Andrzej Martyna

นี่เป็นส่วนเสริมที่ยอดเยี่ยม อย่างไรก็ตามคำถามเดิมไม่ได้กล่าวถึงประเภทของแหล่งที่มาและปลายทางและไม่ต้องการให้เป็นประเภทเดียวกัน
jpaugh

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);

destจะได้รับการอัปเดตพร้อมกับค่าคุณสมบัติทั้งหมดจากsrcที่ใช้ร่วมกัน ค่าของคุณสมบัติที่เป็นเอกลักษณ์จะยังคงเหมือนเดิม

นี่คือซอร์สโค้ดที่เกี่ยวข้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.