Home > Microsoft .NET > Klonen von Objekten in C#

Klonen von Objekten in C#

Möchte man existierende Objekte in Microsoft.NET klonen, so steht scheinbar die Schnittstelle System.ICloneable zur Verfügung. Dazu wird dann oft zur Implementation der Methode MemberwiseClone geraten. In der Praxis zeigt sich leider, das Referenzen somit aber nicht geklont werden.

Eine Lösung wird durch Serialisierung angeboten:
http://www.csharp411.com/c-object-clone-wars/ (Punkt 4)
Auf diesem Weg kann ein Datenabzug eines Objekts erstellt werden und auf dieser Basis kann eine Kopie (Clone) erzeugt werden. Eine Demonstration eines CloneManagers habe ich hier dargestellt.

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
 
namespace ConsoleApplication6
{
    public static class CloneManager
    {
        public static T Clone<T>(T instance) where T : class
        {
            var serializer = new BinaryFormatter();
            var stream = new MemoryStream();
            serializer.Serialize(stream, instance);
            stream.Seek(0, SeekOrigin.Begin);
            return serializer.Deserialize(stream) as T;
        }
    }
 
    [Serializable]
    public class A
    {
        public int C { get; set; }
        public B B { get; set; }
        public A()
        {
            B = new B();
        }
    }
    [Serializable]
    public class B
    {
        public int[] Ints { get; set; }
 
        public B()
        {
            Ints = new[] {2, 4, 5};
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            var a = new A {C = 3};
            var a2 = CloneManager.Clone(a);
            a.B.Ints[1] = 3;
            Console.WriteLine("a.C {0} - a2 {1}", a.C, a2.C);
            Console.WriteLine("a.B [0] {0} - a2.B [0] {1}", a.B.Ints[0], a2.B.Ints[0]);
            Console.WriteLine("a.B [1] {0} - a2.B [1] {1}", a.B.Ints[1], a2.B.Ints[1]);
            Console.ReadKey();
        }
    }
}

Der CloneManager ist an diese Version http://www.codeproject.com/KB/cs/CloneManager.aspx angelehnt.

KategorienMicrosoft .NET Tags:
  1. 20. Januar 2015, 11:13 | #1

    Eine Frage dazu: Ich baue gerade eine WPF Anwendung für ein Ticket-System. Da die erste Initialisierung meines Ticket-Formulars sehr lang dauert, möchte ich dieses Formular schon bei Programmstart versteckt öffnen und initialisieren und bei Bedarf ein Klon davon machen und anzeigen. Würde dieser CloneManager auch bei Fensterklassen funktionieren?

  2. 24. Januar 2015, 22:42 | #2

    @Thorsten Schröer
    Vermutlich nicht. Der CloneManager geht über Serialisierung. Das mag einen vollen Abzug ermöglichen, aber ein Formular enthält normalerweise mehr, wie beispielsweise Handles, Events, etc… Ich kann mir nicht vorstellen, das ein Formular klonbar ist. Mein Ansatz wäre hier ein Task, der beim Start losläuft und „nach Abruf“ einfach nochmal angestoßen wird. Quasi immer ein Formular asynchron auf Vorrat erzeugt…

  1. Bisher keine Trackbacks