如何自动化(映射子成员)

我有类似的东西

public class ProductViewModel { public int SelectedProductId { get; set; } public string ProductName {get; set;} public int Qty {get; set;} public List Products { get; set}; } 

我有这样的域名

 public class Product { public int ProductId {get; set;} public string ProductName {get; set;} public int Qty {get; set;} } public class Store { public Product() {get; set;} } 

现在我需要进行映射。

//在我的控制器里

 var result = Mapper.Map(Product); 

这不会绑定任何东西,因为它无法弄清楚如何将ProductId放入其中

 Store.Product.ProductId; 

我的地图是这样的

 Mapper.CreateMap().ForMember(dest => dest.Product.ProductId, opt => opt.MapFrom(src => src.SelectedProductId)); 

我收到这个错误

表达式’dest => Convert(dest.Product.SelectedProductId’必须解析为顶级成员。参数名称:lambdaExpression

我不确定该怎么做。

您得到的错误是因为您无法在对象图中深度声明多个级别的映射声明。

因为你只发布了一个属性,我很难为你提供使这项工作的代码。 一种选择是将viewmodel属性更改为MyTestTestId,并且约定将自动获取。

要映射嵌套结构,只需在MapFrom参数中创建一个新对象。

制图:

 Mapper.CreateMap() .ForMember(d => d.MyNestedType, o => o.MapFrom(t => new NestedType { Id = t.Id })); Mapper.AssertConfigurationIsValid(); 

测试代码:

 var source = new Source { Id = 5 }; var destination = Mapper.Map(source); 

类别:

 public class Source { public int Id { get; set; } } public class Destination { public NestedType MyNestedType { get; set; } } public class NestedType { public int Id { get; set; } } 

您可以使用解析器。

创建一个这样的解析器类:

 class StoreResolver : ValueResolver { protected override int ResolveCore(Store store) { return store.Product.ProductId; } } 

并使用它:

 Mapper.CreateMap() .ForMember(dest => dest.SelectedProductId, opt => opt.ResolveUsing()); 

希望它会有所帮助……

allrameest对此问题给出的正确答案应该有所帮助: AutoMapper – 深层映射

这就是你需要的:

 Mapper.CreateMap() .ForMember(dest => dest.Product, opt => opt.MapFrom(src => src)); Mapper.CreateMap() .ForMember(dest => dest.ProductId, opt => opt.MapFrom(src => src.SelectedProductId)); 

注意:此时您应该尝试不再使用Mapper.CreateMap,它已经过时,很快就会得不到支持。