Skip to main content
 首页 » 编程设计

c#之将项目添加到新集合而不是替换整个集合

2024年01月25日24jyk

我正在使用 Automapper,我想知道是否可以将源集合中的所有项目添加到目标。

考虑以下几点:

public class A { public IDictionary<int, string> myDictionary = new Dictionary<int, string>(); } 
 
public class B { public IDictionary<int, string> myDictionary = new Dictionary<int, string>(); } 

然后创建映射:

Mapper.CreateMap<A, B>(); 

并进行实际映射:

Mapper.Map<A, B>(instanceOfA); 

我相信这会在幕后发生:

newInstanceOfB.myDictionary = instanceOfA.myDictionary 

但是是否可以告诉 Automapper 这样做(也许使用自定义转换器...):

foreach (var item in instanceOfA.myDictionary) 
    newInstanceOfB.myDictionary[item.Key] = item.Value 

请您参考如下方法:

这似乎对我有用

Mapper.CreateMap<A, B>() 
     .ForMember(d => d.myDictionary, opt => opt.ResolveUsing( 
                s => s.myDictionary.ToDictionary(pair => pair.Key, pair => pair.Value))); 

这是完整的例子

public class A { public IDictionary<int, string> myDictionary = new Dictionary<int, string>(); } 
public class B { public IDictionary<int, string> myDictionary = new Dictionary<int, string>(); } 
 
class Program 
{ 
    static void Main(string[] args) 
    { 
        var instanceOfA = new A 
                              { 
                                  myDictionary = new Dictionary<int, string> 
                                                     { 
                                                         {1, "a"}, 
                                                         {2, "b"} 
                                                     } 
                              }; 
        Mapper.CreateMap<A, B>() 
            .ForMember(d => d.myDictionary, opt => opt.ResolveUsing( 
              s => s.myDictionary.ToDictionary(pair => pair.Key, pair => pair.Value))); 
        var instanceOfB = Mapper.Map<A, B>(instanceOfA); 
        instanceOfA.myDictionary[1] = "c"; 
 
        if (instanceOfB.myDictionary[1] == "c") 
            Console.WriteLine("Failed"); 
        else 
            Console.WriteLine("Succeeded"); 
        Console.ReadLine(); 
    } 
} 

评论后编辑: *再次编辑 *

Mapper.CreateMap<A, B>() 
   .ForMember(d => d.myDictionary, opt => opt.Ignore()) 
   .AfterMap((s, d) => 
                      { 
                       d.myDictionary.Clear(); 
                       s.myDictionary.ToList().ForEach(p => d.myDictionary.Add(p)); 
                   });