2

我正在尝试对自定义数据结构执行深层复制。我的问题是object[]包含我要复制的数据的数组 ( ) 有许多不同的类型 ( string, System.DateTime, 自定义结构等)。执行以下循环将复制对象的引用,因此对一个对象所做的任何更改都会反映在另一个对象中。

for (int i = 0; i < oldItems.Length; ++i)
{
  newItems[i] = oldItems[i];
}

有没有一种通用的方法来创建这些对象的新实例,然后将任何值复制到它们中?

Ps 必须避免使用 3rd 方库

4

2 回答 2

2

您可以使用automapper(可从 Nuget 获得)来做到这一点:

object oldItem = oldItems[i];
Type type = oldItem.GetType();
Mapper.CreateMap(type, type);
// creates new object of same type and copies all values
newItems[i] = Mapper.Map(oldItem, type, type);
于 2012-12-18T10:42:53.443 回答
0

假设 Automapper 是不可能的(正如@lazyberezovsky 在他的回答中指出的那样),您可以将其序列化为副本:

public object[] Copy(object obj) {
    using (var memoryStream = new MemoryStream()) {
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(memoryStream, obj);
        memoryStream.Position = 0;

        return (object[])formatter.Deserialize(memoryStream);
    }
}

[Serializable]
class testobj {
    public string Name { get; set; }
}

class Program {
    static object[] list = new object[] { new testobj() { Name = "TEST" } };

    static void Main(string[] args) {

        object[] clonedList = Copy(list);

        (clonedList[0] as testobj).Name = "BLAH";

        Console.WriteLine((list[0] as testobj).Name); // prints "TEST"
        Console.WriteLine((clonedList[0] as testobj).Name); // prints "BLAH"
    }
}

但请注意:这一切都非常低效......当然有更好的方法来做你想做的事情。

于 2012-12-18T10:51:17.287 回答