2

カスタム データ構造でディープ コピーを実行しようとしています。私の問題は、object[]コピーしたいデータを保持する配列 ( ) がさまざまなタイプ ( stringSystem.DateTime、カスタム構造など) であることです。次のループを実行すると、オブジェクトの参照がコピーされるため、1 つのオブジェクトで行われた変更は他のオブジェクトにも反映されます。

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

これらのオブジェクトの新しいインスタンスを作成し、それらの値をコピーする一般的な方法はありますか?

Ps はサードパーティのライブラリを避ける必要があります

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 に答える