C# 自动映射递归
我想使用AutoMapper制作一个复杂对象树的深度副本。 问题是,对于每个成员,我希望构造一个新对象,然后映射它,而不是简单地复制现有对象。 这是一个例子:C# 自动映射递归,c#,automapper,C#,Automapper,我想使用AutoMapper制作一个复杂对象树的深度副本。 问题是,对于每个成员,我希望构造一个新对象,然后映射它,而不是简单地复制现有对象。 这是一个例子: public abstract class Test { public Test() { this.Id = Guid.NewGuid(); } public Guid Id { get; private set; } }
public abstract class Test
{
public Test()
{
this.Id = Guid.NewGuid();
}
public Guid Id { get; private set; }
}
public class OuterTest : Test
{
public InnerTest Inner { get; set; }
}
public class InnerTest : Test
{
public int Value { get; set; }
}
以及如何测试它:
OuterTest outerDest = Mapper.Map<OuterTest, OuterTest>(outerSource);
System.Diagnostics.Debug.WriteLine("InnerSource id: " + innerSource.Id);
System.Diagnostics.Debug.WriteLine("InnerSource value: " + innerSource.Value);
System.Diagnostics.Debug.WriteLine("OuterSource id: " + outerSource.Id);
System.Diagnostics.Debug.WriteLine("OuterDest id: " + outerDest.Id);
System.Diagnostics.Debug.WriteLine("OuterDest.Inner id: " + outerDest.Inner.Id);
System.Diagnostics.Debug.WriteLine("OuterDest.Inner value: " + outerDest.Inner.Value);
问题是,对象innerSource始终与outerDest.Inner是同一个实例(我通过VS debugger的MakeObjectId进行了验证),但我希望它们是两个不同的实例
如何使用这种行为创建递归映射?我尝试创建一个自定义IValueResolver,如下所示,但没有成功
public class AutoMapperNewObjectResolver : IValueResolver
{
public ResolutionResult Resolve(ResolutionResult source)
{
object resolved;
if (source.Value != null)
{
object instance = Activator.CreateInstance(source.MemberType);
resolved = Mapper.Map(source.Value, instance, source.MemberType, source.MemberType);
}
else
{
resolved = null;
}
ResolutionResult result = source.New(resolved, source.Context.DestinationType);
return result;
}
}
配置如下:
Mapper.CreateMap<OuterTest, OuterTest>()
.ForMember(d => d.Inner, o => o.ResolveUsing<AutoMapperNewObjectResolver>().FromMember(src => src.Inner));
Mapper.CreateMap()
.formMember(d=>d.Inner,o=>o.resolvusing().FromMember(src=>src.Inner));
非常感谢您的帮助,谢谢您可以使用ValueInjector执行此操作,在设置值之前,您需要在注入中使用Activator这是否回答了您的问题?您可以使用ValueInjector执行此操作,在设置值之前,您需要在注入中使用Activator。这是否回答了您的问题?
Mapper.CreateMap<OuterTest, OuterTest>()
.ForMember(d => d.Inner, o => o.ResolveUsing<AutoMapperNewObjectResolver>().FromMember(src => src.Inner));