2014-07-25 44 views
1

我有一个对象的集合,需要填充目标类中的集合。我已经尝试了一些东西,但完全没有。任何帮助,高度赞赏。 这里是源对象:Automapper:嵌套映射与收藏列表内

public class SourceClass 
{ 
    public Sessions SourceSessions { get; set; } 
} 
public class Sessions 
{ 
    public List<Session> SessionCollection { get; set; } 
} 

public class Session 
{ 
    public DateTime SessionInfo { get; set; } 
} 

和目标对象是:

public class DestinationClass 
{ 
    public List<DateTime> Sessions; 
} 

我需要填充DestinationClass使用AutoMapper。 我看到唯一可能的映射将发生在实际映射需要发生的Session和DestinationClass之间,但是,DestinationClass属性是Session内部whats的集合,但为了获得集合,我将它映射到Sessions对象相反,并试图写这样的自定义解析器:

public static class AutoMapperConfig 
{ 
    public static void RegisterMappings() 
    { 
     Mapper.CreateMap<Sessions, DestinationClass>(); 
    } 
} 
public class CustomResolver : ValueResolver<Sessions, DestinationClass> 
{ 
    protected override DestinationClass ResolveCore(Sessions source) 
    { 
     DestinationClass dest = new DestinationClass(); 
     List<DateTime> lstDates = new List<DateTime>(); 
     foreach (Session session in source.SessionCollection) 
      lstDates.Add(session.SessionInfo); 

     dest.Sessions = lstDates; 
     return dest; 
    } 
} 

然后执行它就像下面不工作。无法理解其错误的地方。

private void button1_Click(object sender, EventArgs e) 
    { 
     Session session1 = new Session(); 
     session1.SessionInfo = DateTime.Now; 

     Session session2 = new Session(); 
     session2.SessionInfo = DateTime.Now; 

     Sessions sessions = new Sessions(); 

     List<Session> lstSessions = new List<Session>(); 

     lstSessions.Add(session1); 
     lstSessions.Add(session2); 

     sessions.SessionCollection = lstSessions; 

     SourceClass src = new SourceClass(); 
     src.SourceSessions = sessions; 

     DestinationClass dest = new DestinationClass(); 

     Sessions sessionsCopy = new Sessions(); 
     sessionsCopy = src.SourceSessions; 

     Mapper.Map(sessionsCopy,dest); 

     MessageBox.Show(dest.Sessions[0].ToString()); 

    } 

回答

1

有两种可能的方式来做到这一点。首先是简单地使用LINQ。如果srcSourceClass一个实例:

var dest = new DestinationClass 
{ 
    Sessions = src.SourceSessions.SessionCollection.Select(s => s.SessionInfo).ToList() 
}; 

如果你想要去theAutomapper路线,你可以告诉Automapper使用映射对象的时候,上面的表达式:

Mapper.CreateMap<SourceClass, DestinationClass>() 
    .ForMember(d => d.Sessions, o => o.MapFrom(sess => sess.SourceSessions.SessionCollection.Select(s => s.SessionInfo))); 

UPDATE:

以下是验证映射的单元测试:

var src = new SourceClass 
{ 
    SourceSessions = new Sessions 
    { 
     SessionCollection = new List<Session> 
     { 
      new Session 
      { 
       SessionInfo = new DateTime(2012, 1, 2), 
      }, 
      new Session 
      { 
       SessionInfo = new DateTime(2014, 5, 6) 
      } 
     } 
    } 
}; 

Mapper.CreateMap<SourceClass, DestinationClass>() 
    .ForMember(d => d.Sessions, o => o.MapFrom(sess => sess.SourceSessions.SessionCollection.Select(s => s.SessionInfo))); 
Mapper.AssertConfigurationIsValid(); 

var dest = Mapper.Map<SourceClass, DestinationClass>(src); 
Assert.AreEqual(2, dest.Sessions.Count); 
Assert.IsTrue(dest.Sessions.Contains(new DateTime(2012, 1, 2))); 
Assert.IsTrue(dest.Sessions.Contains(new DateTime(2014, 5, 6))); 
+0

嗨帕特里克..感谢您的帮助。不过,我确实了解你的方法,但我遇到了一个问题。这个不解析映射,因为DestinationClass是List ,Session对象的SessionInfo只是DateTime。 – user3836777

+0

根据您原来的帖子,DestinationClass是一个包含列表的类,它本身不是列表。原始类定义不准确吗?如果您愿意,我可以使用您的原始源和目标类定义发布单元测试,以显示我的答案中所述的LINQ方法和Aut​​omapper方法。 – PatrickSteele

+0

它正确DestinationClass包含列表它正是根据我在原始查询中显示的类。我也使用映射,如你所示,但我得到的错误在var dest = Mapper.Map (src);. – user3836777