2014-02-13 58 views
2

我有一個包含字典的實體,我想要實現的是automapper不是簡單地替換字典,而是更新它的值。Automapper更新字典值

class ExampleClass 
{ 
    public string Name { get; set; } 
    public Dictionary<int, string[]> Dictionary { get; set; } 
} 

Mapper.CreateMap<ExampleClass, ExampleClass>().ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull)); 

var originalClass = new ExampleClass(); 
originalClass.Name = "Original Class"; 
originalClass.Dictionary = new Dictionary<int, string[]> 
{ 
    {0, new []{"V1", "V2", "V3"}}, 
    {1, new []{"V1", "V2", "V3"}}, 
    {2, new []{"V1", "V2", "V3"}} 
}; 

var newelyCreatedClass = new ExampleClass(); 
newelyCreatedClass.Dictionary = new Dictionary<int, string[]> 
{ 
    {1, new []{"E1", "E2", "E9"}}, 
}; 

Mapper.Map(newelyCreatedClass, originalClass); 

在上面的代碼,automapper奇怪不更新與關鍵== 1字典元件但替換整個原始之一,在newelyCreatedClass創建的。

+0

那麼任何形式的幫助? –

+0

我可以在這裏使用一些。 –

+0

我需要一個直接的幫助,我堅持這一點,我希望自動映射器加入2個數組而不是替換它們,如果存在值就忽略它。 –

回答

0

AutoMapper只是自動比較和設置值,如果它們存在,這就是爲什麼屬性被覆蓋。但是你可以做的是使用一個稱爲Custom Value Resolvers的自動映射器功能。

然後你可以寫一個解析器來檢查字典及其值。

public class CustomResolver : IValueResolver<ExampleClass, ExampleClass, Dictionary<int, string[]>> 
{ 
    public Dictionary<int, string[]> Resolve(ExampleClass source, ExampleClass destination, Dictionary<int, string[]> member, ResolutionContext context) 
    { 
     // logic to iterate through the dictionarys and resolve into dictionary containing values that you want. 
    } 
}