我有一个简单的映射,它正在工作,但它没有填写Output.Details。
我有点困惑,我想也许是因为我使用的来源是每个人的“任务”。
Mapper.CreateMap<Task, Output>();
Mapper.CreateMap<Task, Output.Details>().ForMember(
dest => dest.Item, opt => opt.MapFrom(src => src.Name));
据我所知,我必须创建2个地图,1个用于对象,1个用于包含在其中的对象。
问题是OUTPUT的来源和OUTPUT.DETAILS可以在任务中找到
我尝试在第一张地图中钻研详情并指定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);
地图有效,但我在Output.Details中的属性“Item”是空的
我做错了什么..这是我的目标对象。任何帮助真的很感激
它填写Name没有问题,但在DETAILS中没有任何内容......它们都是NULL
任务不是我的班级,但我检查了它,所有值都被复制,因此Tag有一个值并且是一个STRING。
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();
}
}
修改
以下是Task类的示例。
修改
这是一个示例vs 2010项目,它显示了问题。
http://dl.dropbox.com/u/20103903/AutomapperNotWorking.zip
这是一个显示问题的图片,因为你可以看到摘要项目是“NULL”但它应该包含来自任务的NAME。
答案 0 :(得分:4)
首先,请始终使用Mapper.AssertConfigurationIsValid();
以确保您的映射配置有效。我将它添加到您的代码中,它立即突出显示了问题:您没有告诉Automapper如何处理Summary属性。由于Task不包含名为Summary的属性,因此Automapper需要知道如何处理它。
所以问题不在于如何映射嵌套类,您只需要告诉Automapper如何处理Summary。以下是适用于您的示例的Automapper配置:
Mapper.CreateMap<Task, Output>()
.ForMember(d => d.Summary, o => o.MapFrom(t => new Output.Details {Item = t.Name}));
Mapper.AssertConfigurationIsValid();
这就是你所需要的一切。
答案 1 :(得分:0)
对于新版本,可以执行以下操作:
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<UdtDevQuestion, QuestionViewModel>();
});
config.AssertConfigurationIsValid();