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,我想使用AutoMapper制作一个复杂对象树的深度副本。 问题是,对于每个成员,我希望构造一个新对象,然后映射它,而不是简单地复制现有对象。 这是一个例子: public abstract class Test { public Test() { this.Id = Guid.NewGuid(); } public Guid Id { get; private set; } }

我想使用AutoMapper制作一个复杂对象树的深度副本。 问题是,对于每个成员,我希望构造一个新对象,然后映射它,而不是简单地复制现有对象。 这是一个例子:

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