使用映射库将嵌套对象映射到C#中的自定义对象

使用映射库将嵌套对象映射到C#中的自定义对象,c#,.net,mapping,automapper,C#,.net,Mapping,Automapper,我有以下对象结构: /// <summary> /// nested message instance provided by a business service /// </summary> public class Message { public string Subject { get; set; } public DateTime CreationDate { get; set; } public List<Message>

我有以下对象结构:

/// <summary>
/// nested message instance provided by a business service
/// </summary>
public class Message
{
    public string Subject { get; set; }
    public DateTime CreationDate { get; set; }
    public List<Message> Messages { get; set; }
}
/// <summary>
/// UI Object used to display a nested message structure
/// </summary>
public class MessageViewModel : ViewModelBase
{
    public bool IsSelected { get; set; }

    public string Subject { get; set; }

    public DateTime CreationDate { get; set; }
    public List<MessageViewModel> Messages { get; set; }
}
//
///业务服务提供的嵌套消息实例
/// 
公共类消息
{
公共字符串主题{get;set;}
公共日期时间创建日期{get;set;}
公共列表消息{get;set;}
}
我想将该对象映射到以下对象结构:

/// <summary>
/// nested message instance provided by a business service
/// </summary>
public class Message
{
    public string Subject { get; set; }
    public DateTime CreationDate { get; set; }
    public List<Message> Messages { get; set; }
}
/// <summary>
/// UI Object used to display a nested message structure
/// </summary>
public class MessageViewModel : ViewModelBase
{
    public bool IsSelected { get; set; }

    public string Subject { get; set; }

    public DateTime CreationDate { get; set; }
    public List<MessageViewModel> Messages { get; set; }
}
//
///用于显示嵌套消息结构的UI对象
/// 
公共类MessageViewModel:ViewModelBase
{
公共布尔值被选为{get;set;}
公共字符串主题{get;set;}
公共日期时间创建日期{get;set;}
公共列表消息{get;set;}
}
是否有任何绘图程序可以轻松完成这项工作?

您可以使用它。要首先映射某些类型,需要创建一些映射:

Mapper.Initialize(cfg => cfg
    .CreateMap<Message, MessageViewModel>());

这是静态映射器的唯一示例,但也可以将映射器创建为对象。有关更高级的主题,您可以阅读文档:

我强烈建议使用Automapper,因为它非常简单易用。在Automapper中,默认情况下会映射具有相同名称的字段,并且需要最少的配置。您希望实现的映射将按以下方式完成:

  var config = new MapperConfiguration(cfg =>
  {
      cfg.CreateMap<Message, MessageViewModel>();
  });
SourceClass SourceObject = new SourceClass();
// Populate SourceObject with values

var mapper = config.CreateMapper();
DesitnationClass DestinationObject = mapper.Map<DesitnationClass>(SourceObject);
var config=new-MapperConfiguration(cfg=>
{
CreateMap();
});
对于集合,如果为其数据类型定义了配置,Automapper可以映射以下内容:

  • 数不清
  • I收集
  • 伊里斯特
  • 名单
  • 阵列
因为在您的案例中已经为列表的数据类型提供了映射,所以不需要进一步的配置

如果您希望映射具有不同名称的字段,或者希望在流程中进行一些基本级别的验证,则可以使用以下语法定义配置:

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Message, MessageViewModel>()
    .ForMember(destination => destination.SomeDestinationField, map => map.MapFrom(source => source.SomeSourceFieldWithDifferentName))
    .ForMember(destination => destination.SomeDestinationField, map => map.MapFrom(source => source.SomeSourceField ?? SomeDefaultValue));
});
var config=new-MapperConfiguration(cfg=>
{
cfg.CreateMap()
.ForMember(destination=>destination.SomeDestinationField,map=>map.MapFrom(source=>source.SomeSourceFieldWithDifferentName))
.ForMember(destination=>destination.SomeDestinationField,map=>map.MapFrom(source=>source.SomeSourceField??SomeDefaultValue));
});
然后,我们可以使用MapperConfiguration对象初始化映射器,并按如下方式执行映射:

  var config = new MapperConfiguration(cfg =>
  {
      cfg.CreateMap<Message, MessageViewModel>();
  });
SourceClass SourceObject = new SourceClass();
// Populate SourceObject with values

var mapper = config.CreateMapper();
DesitnationClass DestinationObject = mapper.Map<DesitnationClass>(SourceObject);
SourceClass SourceObject=new SourceClass();
//用值填充SourceObject
var mapper=config.CreateMapper();
DesitnationClass DestinationObject=mapper.Map(SourceObject);

我建议您仔细阅读这些内容。

Automapper是最好的:)除了
IsSelected
属性(我不知道您如何映射它),其他内容将非常简单地使用Automapper。谢谢,关于IsSelected,使用Automapper很容易解决。。它将被映射并用false初始化。