如何制作对象副本,没有引用C#?

时间:2015-01-19 07:25:55

标签: c# reference mapping

我有一个包含以下内容的课程:

[DataContract(Namespace = "Default")]    
public class Book
{
   ...
   some values
   ...
   [DataMember]
   public IList<Option> BookOptions {get; set;}
   ...
   some values
   ...
}

在我的程序中的某些方面,我需要在数据库中制作现有书籍的副本并对其进行更改。

我在做什么:

var copy = (T)Activator.CreateInstance(typeof(T));
AutoMapper.Mapper.Map<T, T>(existBook, copy);
previousBook = copy;

AutoMapper.Mapper.Map(source, existBook, source.GetType(), typeof(T));

来源 - 书籍有变化。基本上,我想存储在previousBook旧数据和existsBook中获取新数据。 一切正常除了一件事: BookBook中对existBook的任何更改都会自动更改previousBook中的BookOptions。换句话说,previousBook和existBook具有相同的BookOptions IList ...据我所知存在引用或类似的东西(我是新手所以我不能说得更清楚)。

所以我的问题是:如何在没有任何引用的情况下制作对象副本?

2 个答案:

答案 0 :(得分:0)

使用以下行:previousBook = copy,您可以创建对象“copy”的引用。你需要的是一个深度克隆: https://stackoverflow.com/a/129395

我建议你阅读这篇文章:http://www.albahari.com/valuevsreftypes.aspx

答案 1 :(得分:0)

您是否忘了CreateMap

使用以下代码,我能够创建一个新的单独实例:

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

    public IList<string> Authors { get; set; }
}

//....

AutoMapper.Mapper.CreateMap<Book, Book>();

var book1 = new Book
{
    Name = "Original Book",
    Authors = new List<string>()
    {
        "Joe Blogs",
        "Jane Blogs"
    }
};

var bookCopy = AutoMapper.Mapper.Map<Book>(book1);

book1.Authors.Add("Me");

//book has 3 authors and bookCopy has the original 2

试试这个:

previousBook = AutoMapper.Mapper.Map<Book>(existBook);

现在,您可以对existBook进行更改,previousBook应保持不变。