【问题标题】:Map Nested object to a custom object in C# using a mapping library使用映射库将嵌套对象映射到 C# 中的自定义对象
【发布时间】: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 初始化。

标签: c# .net mapping automapper


【解决方案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

    【讨论】:

      猜你喜欢
      • 2013-08-01
      • 2012-12-02
      • 2021-07-06
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      相关资源
      最近更新 更多