Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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 class Person { public string Name { get; set; } } public class State { public string Name { get; set; } p

我有一个映射来复制一个人和一个状态,但是当我复制状态时,我不需要一个人的深度复制,只需要引用,但我正在使用automapper在其他地方创建一个人的深度复制,所以有一个个人和状态的映射

    public class Person
    {
        public string Name { get; set; }
    }

    public class State
    {
        public string Name { get; set; }
        public Person CreatedBy { get; set; }
    }

    [TestMethod]
    public void CopyByReference()
    {
        Mapper.CreateMap<Person, Person>();
        Mapper.CreateMap<State, State>();

        var original = new State { Name = "Start", CreatedBy = new Person { Name = "Employee name" } };
        var copy = Mapper.Map<State>(original);
        Assert.AreEqual(original.Name, copy.Name);
        if (!ReferenceEquals(original.CreatedBy, copy.CreatedBy))
        {
            throw new Exception("I need a reference copy, not deep copy.");
        }
    }
公共类人物
{
公共字符串名称{get;set;}
}
公共阶级国家
{
公共字符串名称{get;set;}
由{get;set;}创建的公共人物
}
[测试方法]
public void CopyByReference()
{
CreateMap();
CreateMap();
var original=newstate{Name=“Start”,CreatedBy=newperson{Name=“Employee Name”};
var copy=Mapper.Map(原件);
Assert.AreEqual(original.Name,copy.Name);
如果(!ReferenceEquals(original.CreatedBy,copy.CreatedBy))
{
抛出新异常(“我需要引用副本,而不是深度副本”);
}
}

我曾尝试实现一个IValueResolver,但我也得到了深度拷贝。我可以简单地忽略CreatedBy属性并在映射后复制引用,但这非常难看,而且看起来很容易出错。

Automapper并不是专门为此而设计的,所以它在找到映射时总是尝试使用映射,所以它总是尝试映射您的
Person
对象

一种解决方法是
忽略
状态上创建的
CreatedBy
,并在
AfterMap
回调中复制它:

Mapper.CreateMap<State, State>()
    .ForMember(d => d.CreatedBy, c => c.Ignore())
    .AfterMap((src, dest) => { dest.CreatedBy = src.CreatedBy; });
Mapper.CreateMap()
.ForMember(d=>d.CreatedBy,c=>c.Ignore())
.AfterMap((src,dest)=>{dest.CreatedBy=src.CreatedBy;});

您可以删除这一行:
Mapper.CreateMap()

这将使AutoMapper复制引用,而不是执行深度复制