2012-04-02 46 views
5

我使用Automapper獲取相同類型的兩個對象,並映射任何已更改的新值。我嘗試使用下面的代碼,但它一直拋出一個錯誤,我甚至不確定這是否甚至可以用Automapper來實現。AutoMapper - 使用相同的源和目標對象類型的地圖

例如:

 Mapper.CreateMap<UserDetails, UserDetails>(); 
     UserDetails userDetails = Mapper.Map<UserDetails, UserDetails>(userDetailsCurrent, userDetailsNew); 

基本上,我需要通過從新對象「userDetailsNew」現有的對象「userDetailsCurrent」進來任何新的值複製 - 即使他們是同一類型的。這樣我就可以用新值「更新」現有對象。我這樣做的原因是因爲我不確定將傳遞哪些用戶詳細信息 - 我需要在他們到達時映射它們。

我通常使用Automapper來映射具有相似屬性的不同對象 - 但我認爲我可以使用Automapper的功能以這種方式實現相同的功能。甚至可能有更好的解決方案 - 任何幫助將不勝感激!

+0

Mapper.Map返回UserDetails或UserSession嗎? – 2012-04-02 16:45:18

+0

它應該返回UserDetails - 我剛剛更新了代碼示例。 – Deano 2012-04-02 18:35:47

+0

拋出什麼錯誤? – 2013-10-19 01:53:06

回答

6

這似乎適用於我。我的自定義類型:

class MyType 
{ 
    public int MyInt { get; set; } 
    public string MyString { get; set; } 
} 

我的映射代碼:

Mapper.CreateMap<MyType, MyType>(); 
var source = new MyType() {MyInt = 1, MyString = "Hello world"}; 
var dest = Mapper.Map<MyType, MyType>(source); 

有意思的東西超出了簡單的屬性自定義類型?

+0

這看起來不錯 - 我不在我的電腦附近,所以我檢查一下,儘快回來! – Deano 2012-04-02 18:36:16

+0

有沒有辦法,我可以做到這一點,而不使用ForMember()?對象上的每個屬性都可能更清潔。 – Deano 2012-04-02 18:37:21

+0

是的,如果你不做ForMember,它仍然有效。我只是習慣於使用最初包含它的那些。 – 2012-04-02 18:39:27

4

這可以通過使用元組並通過創建派生自Automapper的Abstract TypeConverter類的自定義類型轉換器來完成。

假設你有一個源和目的類:

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public override string ToString() 
    { 
     return string.Format("Firstname: {0}, Lastname: {1}", FirstName, LastName); 
    } 
} 

然後,你可以構建自定義轉換器類型

public class CustomerPersonConverter : TypeConverter<Tuple<Person, Person>, Person> 
{ 
    protected override Person ConvertCore(Tuple<Person, Person> source) 
    { 
     var orginalValues = source.Item1; 
     var updatedValues = source.Item2; 

     var result = new Person 
      { 
       FirstName = string.IsNullOrEmpty(updatedValues.FirstName) ? orginalValues.FirstName : updatedValues.FirstName, 
       LastName = string.IsNullOrEmpty(updatedValues.LastName) ? orginalValues.LastName : updatedValues.LastName 
      }; 

     return result; 
    } 
} 

可能像

var orginal = new Person() {FirstName = "Clifford", LastName = "Mayson"}; 
     var updated = new Person() {FirstName = "Cliff"}; 

     Mapper.CreateMap<Tuple<Person, Person>, Person>().ConvertUsing<CustomerPersonConverter>(); 

     var result = Mapper.Map<Person>(new Tuple<Person, Person>(orginal, updated)); 

     Console.WriteLine(result); 

使用哪個會產生保留原始姓氏值的結果,因爲在更新中缺少原始姓氏值,但會更新名字的價值,例如。

Firstname: Cliff, Lastname: Mayson 
+0

感謝您的明確示例。 – PratikSatikunvar 2017-11-08 11:39:26

相關問題