C# 自动映射复杂对象
我已经开始实施这个计划C# 自动映射复杂对象,c#,automapper,C#,Automapper,我已经开始实施这个计划 但我想一定有更好的办法 所以我创造了这个 Mapper.CreateMap<StoreTransportWindow, CSVWindow>() .ForMember(dest => dest.DC, opt => opt.ResolveUsing(fa => fa.DC.number)) .ForMember(dest => dest.Type, opt => opt.ResolveUsing(fa =>
但我想一定有更好的办法 所以我创造了这个
Mapper.CreateMap<StoreTransportWindow, CSVWindow>()
.ForMember(dest => dest.DC, opt => opt.ResolveUsing(fa => fa.DC.number))
.ForMember(dest => dest.Type, opt => opt.ResolveUsing(fa => fa.Type))
;
Mapper.CreateMap<Store, CSVStore>()
.ForMember(dest => dest.StoreName, opt => opt.ResolveUsing(fa => fa.name))
.ForMember(dest => dest.StoreNumber, opt => opt.ResolveUsing(fa => fa.number))
;
Mapper.CreateMap()
.ForMember(dest=>dest.DC,opt=>opt.ResolveUsing(fa=>fa.DC.number))
.ForMember(dest=>dest.Type,opt=>opt.ResolveUsing(fa=>fa.Type))
;
Mapper.CreateMap()
.ForMember(dest=>dest.StoreName,opt=>opt.ResolveUsing(fa=>fa.name))
.ForMember(dest=>dest.StoreNumber,opt=>opt.ResolveUsing(fa=>fa.number))
;
现在我想在主映射中使用上面的映射
Mapper.CreateMap<Store, CSVLineObject>()
.ForMember( dest => dest.store, opt => opt.ResolveUsing(/* This is where I'd like to use the above Store to CSVStore mapping */))
;
Mapper.CreateMap()
.ForMember(dest=>dest.store,opt=>opt.ResolveUsing(/*这是我想使用上述存储到CSVStore映射的地方*/)
;
这可能吗
编辑
public class CSVStore
{
public string StoreNumber { get; set; }
public string StoreName { get; set; }
}
public class CSVWindow
{
public string Type { get; set; }
public string DC { get; set; }
public string TPC { get; set; }
public class CSVLineObject
{
public CSVStore store { get; set; }
public List<CSVWindow> storeWindows { get; set; }
公共类CSVStore
{
公共字符串StoreNumber{get;set;}
公共字符串StoreName{get;set;}
}
公共类CSVWindow
{
公共字符串类型{get;set;}
公共字符串DC{get;set;}
公共字符串TPC{get;set;}
公共类CSVLineObject
{
公共CSVStore存储{get;set;}
公共列表存储窗口{get;set;}
如注释中所述,初始映射可能更像:
Mapper.CreateMap()
.ForMember(dest=>dest.DC,opt=>opt.MapFrom(src=>src.DC.number));
//不需要属性类型的映射
Mapper.CreateMap()
.ForMember(dest=>dest.StoreName,opt=>opt.MapFrom(src=>src.name))
.ForMember(dest=>dest.StoreNumber,opt=>opt.MapFrom(src=>src.number));
现在,假设您拥有以下内容:
公共类源代码
{
公共存储{get;set;}
}
公务舱目的地
{
公共CSVStore存储{get;set;}
}
然后,以下映射就足够了(因为您已经定义了到CSVStore
的嵌套映射Store
):
Mapper.CreateMap();
然而,如果目的地更像这样:
公共类目的地
{
公共CSVStore CSVStore{get;set;}
}
然后需要显式定义要映射的属性:
Mapper.CreateMap()
.ForMember(dest=>dest.CSVStore,opt=>opt.MapFrom(src=>src.Store));
(请注意,将自动应用从Store
到CVStore
的映射。)
如果出于某种原因确实需要显式定义嵌套映射,可以执行以下操作:
Mapper.CreateMap()
.FormMember(dest=>dest.destproperty,
opt=>opt.MapFrom(
src=>Mapper.Map(src.srcproperty));
我有时需要使用它,但不是经常使用,因为默认功能会自动为您处理它
如果您可以扩展您的需求,我可以提供更多的详细信息。您可以显示您试图映射的内容吗?(即,什么是
CSVLineObject
,以及dest.store
的类型)。还请注意,您似乎应该使用MapFrom
而不是resolvesusing
,以及第一个映射中的第二个属性(dest.Type
)是按约定自动映射的。@Mightymuke,请参阅我的editWhatsStore
?我想知道为什么您要将Store
映射到CSVLineObject
,而不是执行类似于CSVLineObject.Store=Mapper.Map(Store)
。我想如果您愿意,您可以执行类似于Mapper.CreateMap()的操作.ForMember(dest=>dest.store,opt=>opt.MapFrom(src=>Mapper.Map(src)))
Store只是另一个对象。它有一个数字、一个名称和StoreTransportWindow的集合。我认为实际的对象有点不相关。我更想知道如何在另一个映射中使用映射。你可能也会发现这一点很有趣:最后一个片段在我想的问题的上下文中似乎更有意义。什么实际上,您所做的是在映射中创建映射,而不是引用以前创建的另一个映射,对吗?谢谢您到目前为止的所有帮助。是的,但如前所述,您通常不需要这样做。它是根据映射的嵌套类型自动引用的。这是我必须显式定义ma的一种情况平: