AutoMapper:使用包含不同索引类型的词典进行映射

时间:2013-07-22 19:58:06

标签: c# dictionary automapper

我需要使用AutoMapper将从应用程序数据库中提取的对象数据映射到另一个对象,该对象的类略有不同。不同之处在于命名空间和名为SubMessages的属性,如下所示:

   public Dictionary<int, QcMessageBody> SubMessages
   {
     get { return mSubMessages; }
     set { mSubMessages = value;}
   }

其中字典键是来自数据库(源)的对象中的整数,并且目标对象具有相同的属性,字符串键类型为字符串。

类定义完全相同,减去我已经涵盖的差异。

有人请帮我确定如何设置AutoMapper将一个对象映射到另一个对象。我是AutoMapper的新手,我担心我只是不太了解AutoMapper来设置它。

感谢您的帮助。

[Serializable()]
public class MessageProperties : QCProperties, ISerializable
{
   public MessageProperties() {}
   public Dictionary<string, QcMessageBody> SubMessages
   {
     get {}
     set {}
   }

   public QcMessageBody CurrentSubMessage
   {
     get
     {}
   }

   public Boolean IsVarMsg
   {
     get {}
     set {}
   }

   public Guid SenderId
   {
     get {}
     set {}
   }

   public String SenderName
   {
     get {}
     set {}
   }

   public MessageSchedule Schedule
   {
     get {}
     set {}
   }

   public DateTime TimeSent
   {
     get {}
     set {}
   }

   public Guid RowQueryId
   {
     get {}
     set {}
   }

   public Boolean Solo
   {
     get {}
     set {}
   }

   public List<DestinationTag> Destinations
   {
     get {}
     set {}
   }

   public MessageType MsgType
   {
     get {}
     set {}
   }
 }

1 个答案:

答案 0 :(得分:1)

我找到了解决问题的方法,我想报告一下,希望能帮助其他人,因为他们使用AutoMapper。首先,我试图映射错误的对象。在更好地检查代码之后,我确定我需要映射具有以下多级继承配置的类。

public class MessageInsert : ISerializable, ICloneable {}
public class DateTimeInsert : MessageInsert {}
public class TimeStampInsert : DateTimeInsert, ISerializable {}
public class DateStampInsert : DateTimeInsert, ISerializable {}
public class ClockInsert : DateTimeInsert, ISerializable {}
public class CalendarInsert : DateTimeInsert, ISerializable {}
public class DataInsert : MessageInsert, ISerializable {} 
public class TokenInsert : DataInsert, ISerializable {}
public class VariableInsert : DataInsert, ISerializable {}

我需要映射一个MessageInsert对象,并让子级别的所有属性映射到新对象。 AutoMapper处理继承映射,但必须使用CreateMap语句以特定方式设置它。我在下面使用的CreateMap语句是我如何设置映射,它们似乎工作。如果有人看到了更好的方法来做这些,并希望通过各种手段来加入。

第一个语句块用于处理具有与之关联的命名空间的不同类,枚举,结构等的命名空间映射。

AutoMapper.Mapper.CreateMap<ABC.QC.Properties.MessageSchedule, DBWebAgent.Properties.MessageSchedule>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.DashPropType, DBWebAgent.Properties.DashPropType>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.MessageType, DBWebAgent.Properties.MessageType>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.DestinationTag, DBWebAgent.Properties.DestinationTag>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.QcMessageBody, DBWebAgent.Properties.QcMessageBody>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.DataInsertThreshold, DBWebAgent.Properties.DataInsertThreshold>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.QuickCOMAlarm, DBWebAgent.Properties.QuickCOMAlarm>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.ScrollEffectType, DBWebAgent.Properties.ScrollEffectType>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.MessagePriorityType, DBWebAgent.Properties.MessagePriorityType>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.QcMessageSegment, DBWebAgent.Properties.QcMessageSegment>();          
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.DateTimeInsert, DBWebAgent.Properties.DateTimeInsert>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.DateStampInsert, DBWebAgent.Properties.DateStampInsert>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.TimeStampInsert, DBWebAgent.Properties.TimeStampInsert>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.ClockInsert, DBWebAgent.Properties.ClockInsert>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.CalendarInsert, DBWebAgent.Properties.CalendarInsert>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.DataInsert, DBWebAgent.Properties.DataInsert>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.VariableInsert, DBWebAgent.Properties.VariableInsert>();
AutoMapper.Mapper.CreateMap<ABC.QC.Properties.TokenInsert, DBWebAgent.Properties.TokenInsert>();

定义了第二组CreateMap语句来处理类中的所有继承级别。

AutoMapper.Mapper.CreateMap<ABC.QC.Properties.MessageInsert, DBWebAgent.Properties.MessageInsert>()
     .Include<ABC.QC.Properties.DateTimeInsert, DBWebAgent.Properties.DateTimeInsert>()
     .Include<ABC.QC.Properties.DateStampInsert, DBWebAgent.Properties.DateStampInsert>()
     .Include<ABC.QC.Properties.TimeStampInsert, DBWebAgent.Properties.TimeStampInsert>()
     .Include<ABC.QC.Properties.ClockInsert, DBWebAgent.Properties.ClockInsert>()
     .Include<ABC.QC.Properties.CalendarInsert, DBWebAgent.Properties.CalendarInsert>()
     .Include<ABC.QC.Properties.DataInsert, DBWebAgent.Properties.DataInsert>()
     .Include<ABC.QC.Properties.VariableInsert, DBWebAgent.Properties.VariableInsert>()
     .Include<ABC.QC.Properties.TokenInsert, DBWebAgent.Properties.TokenInsert>();