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

Posted

技术标签:

【中文标题】使用映射库将嵌套对象映射到 C# 中的自定义对象【英文标题】:Map Nested object to a custom object in C# using a mapping library 【发布时间】:2018-10-31 13:37:38 【问题描述】:

我有以下对象结构:

/// <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; 

有没有可以轻松完成工作的映射器?

【问题讨论】:

Automapper 是最好的:) 除了 IsSelected 属性,我不知道你如何映射它,其余的使用 automapper 非常简单。 谢谢,用 Automapper 很容易解决这个问题,关于 IsSelected .. 它将被映射并用 false 初始化。 【参考方案1】:

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

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

这会创建一个从MessageMessageViewModel 的映射。默认情况下,AutoMapper 映射具有相同名称的所有属性。当为它们的类型指定映射时,也将映射嵌套的复杂属性。因此,在您的示例中,上面的映射就足够了,因为嵌套属性类型与其父类型相同,并且源类型的每个属性在目标类型中都有其对应的同名属性。集合被隐式映射到其他集合。

要映射具体对象,您可以使用Mapper.Map 方法:

var messageViewModel = Mapper.Map<MessageViewModel>(message);

这只是静态映射器的示例,但也可以将映射器创建为对象。有关更高级的主题,您可以阅读文档:http://docs.automapper.org/en/stable/

【讨论】:

【参考方案2】:

我强烈推荐使用 Automapper,因为它非常简单易用。在 Automapper 中,默认情况下会映射具有相同名称的字段,并且需要最少的配置。您要实现的映射如下:

  var config = new MapperConfiguration(cfg =>
  
      cfg.CreateMap<Message, MessageViewModel>();
  );

如果是集合,Automapper 可以映射以下内容,前提是已为其数据类型定义了配置:

IEnumerable ICollection 列表 列表 数组

由于在您的情况下已经为列表的数据类型提供了映射,因此不需要进一步配置。

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

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));
);

然后我们可以使用 MapperConfiguration 对象来初始化 Mapper 并执行我们的映射,如下所示:

SourceClass SourceObject = new SourceClass();
// Populate SourceObject with values

var mapper = config.CreateMapper();
DesitnationClass DestinationObject = mapper.Map<DesitnationClass>(SourceObject);

我会推荐通过这些docs。

【讨论】:

以上是关于使用映射库将嵌套对象映射到 C# 中的自定义对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 Dozer 的自定义转换器将对象列表映射到另一个列表

iPhone json 库将 json 映射到我自己的对象

.NET 中的自定义 ORM

在其 HTTP 正文中嵌套 JSON 的 RestKit 对象映射请求

jOOQ & PostgreSQL:将从复杂 jsonb 中提取的嵌套 json 对象映射到自定义类型

使用 create 回调将嵌套对象映射为复杂 JSON 中的 observable