我正在尝试对自定义数据结构执行深层复制。我的问题是,保存我要复制的数据的数组(object[]
)有许多不同的类型(string
,System.DateTime
,自定义结构等)。执行以下循环将复制对象的引用,因此在一个对象中所做的任何更改都将反映在另一个对象中。
for (int i = 0; i < oldItems.Length; ++i)
{
newItems[i] = oldItems[i];
}
是否有通用方法来创建这些对象的新实例,然后将任何值复制到其中?
P.S。必须避免第三方图书馆
答案 0 :(得分: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);
答案 1 :(得分: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"
}
}
但请注意:这一切都非常低效。当然,有更好的方法可以做你想做的事情。