我在两个不同的命名空间下面有以下类,例如Source
和Target
。
映射类:
public class Instance
{
public Type Type { get; set; }
public object Definition { get; set; }
}
public sealed class Class : Instance
{
private IList<Property> m_Properties;
public IList<Property> Properties
{
get { return m_Properties ?? (m_Properties = new List<Property>()); }
}
}
public abstract class Member : Instance
{
public string Name { get; set; }
}
public sealed class Parameter : Member
{
}
public sealed class Property : Member
{
}
请注意,Instance
类具有类型为object的Definition
属性,该属性将保存Class
引用,因此嵌套层次结构将从此处开始,最多为N级。我转换正常,但Class
内的Definition属性及其嵌套的层次结构对象仍然保持Source引用而不是Target。在添加ForMember(t => t.Definition, opt => opt.MapFrom(s => Mapper.Map<Source.Class, Target.Class>((Source.Class)s.Definition)))
以使这种转换以某种方式工作之后,它已经开始给出异常。
用法:
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Source.Member, Target.Member>()
.Include<Source.Property, Target.Property>()
.Include<Source.Parameter, Target.Parameter>()
.ForMember(t => t.Definition, opt => opt.MapFrom(s => Mapper.Map<Source.Class, Target.Class>((Source.Class)s.Definition)));
cfg.CreateMap<Source.Property, Target.Property>();
cfg.CreateMap<Source.Parameter, Target.Parameter>();
});
config.AssertConfigurationIsValid();
var mapper = config.CreateMapper();
var definitionLevel1 = new Source.Class();
definitionLevel1.Properties.Add(new Source.Property() { Name = "PropertyLevel_1.1" });
definitionLevel1.Properties.Add(new Source.Property() { Name = "PropertyLevel_1.2" });
var definitionLevel2 = new Source.Class();
definitionLevel2.Properties.Add(new Source.Property() { Name = "PropertyLevel_2.1" });
definitionLevel1.Definition = definitionLevel2;
Source.Member sourceMember = new Source.Property()
{
Name = "Some_Property_Name",
Definition = definitionLevel1,
Type = typeof(CompositeType)
};
IEnumerable<Source.Member> sourceMembers = new List<Source.Member>() { sourceMember };
var targetMembers = mapper.Map<IEnumerable<Target.Member>>(sourceMembers);
请协助我填补空白或遗失的部分。
答案 0 :(得分:0)
啊,最后,我已经解决了这个复杂的问题,到目前为止,结果似乎很好,但建议使用更好的练习(如果有的话)受到欢迎,因为我是初学者,刚刚开始使用Automapper。
以下是各个映射器的配置。
<强>配置:强>
IMapper memberMapper = null;
IMapper classMapper = null;
var classConfig = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Source.Class, Target.Class>()
.ForMember(t => t.Properties, opt => opt.MapFrom(s => memberMapper.Map<IList<Target.Property>>(s.Properties)))
.ForMember(t => t.Definition, opt => opt.MapFrom(s => classMapper.Map<Source.Class, Target.Class>((Source.Class)s.Definition)));
cfg.CreateMap<Source.Property, Target.Property>();
});
classConfig.AssertConfigurationIsValid();
classMapper = classConfig.CreateMapper();
var memberConfig = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Source.Member, Target.Member>()
.Include<Source.Property, Target.Property>()
.Include<Source.Parameter, Target.Parameter>()
.ForMember(t => t.Definition, opt => opt.MapFrom(s => classMapper.Map<Source.Class, Target.Class>((Source.Class)s.Definition)));
cfg.CreateMap<Source.Property, Target.Property>();
cfg.CreateMap<Source.Parameter, Target.Parameter>();
});
memberConfig.AssertConfigurationIsValid();
memberMapper = memberConfig.CreateMapper();
我使用的想法是两个映射器按其范围一起工作,以递归方式完成此映射。