【发布时间】:2010-12-16 19:17:43
【问题描述】:
我正在尝试映射以下场景:
// SourceA + SourceB to not derive from a shared base class.
class SourceCollection
{
IList<SourceA> ACollection;
IList<SourceB> BCollection;
// ... other properties ...
}
class DestCollection
{
IList<DestBase> Collection;
// ... other properties ...
}
abstract class DestBase { }
// In their destination form, DestA + DestB share DestBase as a base class.
class DestA : DestBase { }
class DestB : DestBase { }
当我映射 SourceCollection > DestCollection 时,我希望将每个集合收集到一个集合中。理想情况下,我想在没有自定义解析器的情况下执行此操作,因为 AutoMapper 了解如何很好地映射 SourceA > DestA 和 SourceB > DestB。我只需要它来实现 SourceA 可以作为 DestA 映射到 DestBase,因为 DestA 派生自 DestBase。
由于没有 SourceBase,我不能只将其映射到 DestBase 并使用 .Include。
我猜这可能需要一个自定义解析器,因为它是两个集合合并为一个(我只希望结果被连接),但如果它不需要它会很好。或者至少我可以编写一个足够通用的自定义解析器,如果 SourceC + DestC 出现,则不需要更改。
更新:
这是一个可以实现的 ValueResolver,但它确实需要考虑每种类型才能手动解析:
public class BaseCollectionResolver : ValueResolver< SourceCollection, IList<DestBase> >
{
protected override IList<DestBase> ResolveCore(SourceCollection source)
{
var items = new List<DestBase>();
foreach (var sourceA in source.ACollection)
items.Add( Mapper.Map<SourceA, DestA>(sourceA) );
foreach (var sourceB in source.BCollection)
items.Add( Mapper.Map<SourceB, DestB>(sourceB) );
return items;
}
}
然后进行相应的映射:
Mapper.CreateMap<SourceCollection, DestCollection>()
.ForMember(dest => dest.Collection, m => m.ResolveUsing<BaseCollectionResolver>());
【问题讨论】:
标签: c# .net automapper