从未知类型的数组创建对象的新实例

时间:2012-12-18 10:30:37

标签: c# reflection

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

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

是否有通用方法来创建这些对象的新实例,然后将任何值复制到其中?

P.S。必须避免第三方图书馆

2 个答案:

答案 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"
    }
}

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