Automapper (C#):嵌套映射不起作用

Mar*_*tin 4 c# inner-classes automapper

我有一个简单的映射,它正在工作,但它没有填写 Output.Details。

我有点困惑,我想这可能是因为我将源用作每个源的“任务”。

  Mapper.CreateMap<Task, Output>();


  Mapper.CreateMap<Task, Output.Details>().ForMember(
       dest => dest.Item, opt => opt.MapFrom(src => src.Name));
Run Code Online (Sandbox Code Playgroud)

据我所知,我必须创建 2 张地图,1 张用于对象,1 张用于其中包含的对象。

问题是 OUTPUT 和 OUTPUT.DETAILS 的来源可以在 TASK 中找到

我尝试深入研究第一张地图中的详细信息并指定 Mapfrom 但它给出了以下错误,这就是为什么我必须创建 2 张地图

         must resolve to top-level member. Parameter name: lambdaExpression error

  IList<Task> tempItems= GetItems();

        IList<Output> items =
            Mapper.Map<IList<Task>, IList<Output>>(tempItems);
Run Code Online (Sandbox Code Playgroud)

地图有效,但我在 Output.Details 中可用的属性“Item”为 NULL

我究竟做错了什么?这是我的 Destination 对象。

它填写 Name 没问题,但 DETAILS 中没有任何内容......它们被保留为 NULL。

任务不是我的课程,但我检查了它并且所有值都在那里被复制,因此标签有一个值并且是一个字符串。

public class Output   
{
    public string Name { get; set; }

    public Details Summary { get; private set; }
 
    public class Details
    {
        public string Item{ get; set; }
    }

    public Output()
    {
        Summary = new Details();
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

这是 Task 类的示例。

在此处输入图片说明

编辑

它们是此处的示例与 2010 项目,它准确地显示了问题。

http://dl.dropbox.com/u/20103903/AutomapperNotWorking.zip

这是显示问题的图像,您可以看到摘要项目为“NULL”,但它应该包含来自任务的名称。

在此处输入图片说明

Pat*_*ele 5

首先,始终使用Mapper.AssertConfigurationIsValid();以确保您的映射配置有效。我将它添加到您的代码中,它立即突出了问题:您没有告诉 Automapper 如何处理 Summary 属性。由于 Task 不包含名为 Summary 的属性,Automapper 需要知道如何处理它。

所以问题不在于如何映射嵌套类,您只需要告诉 Automapper 如何处理摘要。这是适用于您的示例的 Automapper 配置:

Mapper.CreateMap<Task, Output>()
    .ForMember(d => d.Summary, o => o.MapFrom(t => new Output.Details {Item = t.Name}));
Mapper.AssertConfigurationIsValid();
Run Code Online (Sandbox Code Playgroud)

这就是你所需要的。