Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动映射复杂对象_C#_Automapper - Fatal编程技术网

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,请参阅我的editWhats
Store
?我想知道为什么您要将
Store
映射到
CSVLineObject
,而不是执行类似于
CSVLineObject.Store=Mapper.Map(Store)
。我想如果您愿意,您可以执行类似于
Mapper.CreateMap()的操作.ForMember(dest=>dest.store,opt=>opt.MapFrom(src=>Mapper.Map(src)))
Store只是另一个对象。它有一个数字、一个名称和StoreTransportWindow的集合。我认为实际的对象有点不相关。我更想知道如何在另一个映射中使用映射。你可能也会发现这一点很有趣:最后一个片段在我想的问题的上下文中似乎更有意义。什么实际上,您所做的是在映射中创建映射,而不是引用以前创建的另一个映射,对吗?谢谢您到目前为止的所有帮助。是的,但如前所述,您通常不需要这样做。它是根据映射的嵌套类型自动引用的。这是我必须显式定义ma的一种情况平: