Recursive car mechanic

I want to make a deep copy of a complex tree of objects using AutoMapper. The problem is that for each member I would like to build a new object and then display it, and not just copy the existing one. Here is an example:

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; } } 

and how to test it:

 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); 

This is the result of the output window:

 InnerSource id: a60fda37-206a-40a8-a7f8-db480149c906 InnerSource value: 2119686684 OuterSource id: 7486899e-2da8-4873-9160-d6096b555c73 OuterDest id: 7486899e-2da8-4873-9160-d6096b555c73 OuterDest.Inner id: a60fda37-206a-40a8-a7f8-db480149c906 OuterDest.Inner value: 2119686684 

The problem is that the innerSource object is always the same instance as the externalDest.Inner (I checked through the VS debugger's MakeObjectId), but I would like them to be two different instances.

How can I create a recursive map with this behavior? I tried to create a custom IValueResolver as shown below, without success.

  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; } } 

and configured as follows:

 Mapper.CreateMap<OuterTest, OuterTest>() .ForMember(d => d.Inner, o => o.ResolveUsing<AutoMapperNewObjectResolver>().FromMember(src => src.Inner)); 

Any help is appreciated, thanks

+2
c # automapper
source share

No one has answered this question yet.

See similar questions:

8
Automapper Nested Mapping
3
Copy List Items Using AutoMapper
3
Mapping an umbraco node for a pinned object

or similar:

57
How to use AutoMapper.ForMember?
eleven
How to use mapper.Map inside MapperConfiguration AutoMapper?
7
Automapper ignores property ignore
5
Does Automapper intend to work with OOB private setters?
3
Copy List Items Using AutoMapper
2
How can I match parent to child using AutoMapper?
one
Inheriting AutoMapper with the β€œNew” Modifier
0
AutoMapper - passing parameters for matching related objects
0
Autopper convert typeof object to enum
0
The IMapper.map () function returns an object with null values. Autocard Issue

All Articles