![]() |
Re: Objekt duplizieren?
Zitat:
Ansonsten vielen Dank für deine Ausführungen. |
Re: Objekt duplizieren?
Zitat:
Delphi-Quellcode:
In Delphi geht sowas nicht.
[Extension]
class method Cloner.CreateDeepClone<T>(instance : T) : T; begin var bf := new BinaryFormatter(); using s := new MemoryStream() do begin bf.Serialize(s, instance); s.Position := 0; exit T(bf.Deserialize(s)); end; end; .... begin var a := new MyClass(SomeProperty := 'Abc'); var b := a. CreateDeepClone(); b.SomeProperty := b.SomeProperty + 'def'; ... end; Delphis RTTI ist eher das was der Compiler hat liegen lassen, für die meisten Sachen reicht das bissel einfach nicht. Eine flache Kopie ließe sich anfertigen, indem man den Record hinter dem Objekt kopiert. Aber das wäre dann nur ein flache Kopie. Sämtliche Referenzen würden immer noch auf die gleichen Bereiche zeigen. |
Re: Objekt duplizieren?
Ich meinte auch von Haus aus. Selbst basteln kann man sich fast immer was ;)
Und bei deiner Methode muss die Klasse und alle Klassen die sonst wie in dem Objektgraphen hängen das Attribut SerializableAttribute haben, sonst mag der BinaryFormatter nich mehr. // Oder war dein Hust auf mein Schreiben von C# anstatt .NET bezogen? :) |
Re: Objekt duplizieren?
Zitat:
Wenn in .Net eine Klasse IClonable implementiert, dann entspricht das dem was man von einem AssignTo bei TPersistent "erwarten" würde: Ein komplett eigenständiger Klon. Nur halt ohne dich an einen Vorfahren zu fesseln. Was ich oben stehen habe ist eine Extension method, mit der man jede Klasse kopieren kann, da der Inhalt der Felder rekursiv und inklusive zirkulärer Referenzen kopiert wird. |
Re: Objekt duplizieren?
Jo, Clone() von IClonable macht eine tiefe Kopie, MemberwiseClone() eine flache. Und was bringt mir dann deine Methode?
|
Re: Objekt duplizieren?
Zitat:
|
Re: Objekt duplizieren?
Und das Serializable-Attribut auf der Klasse auch nicht ;)
|
Re: Objekt duplizieren?
Delphi-Quellcode:
Es wird dabei davon ausgegangen, das beide übergebenen Parameter bereits instanziert sind.
procedure CopyComponent(AComponentChild, ACopyOfComponentChild: : TComponentChild);
var locMS : TMemoryStream; begin locMS := nil; try locMS := TMemoryStream.Create; try locMS.WriteComponent(AComponentChild); locMS.Position := 0; locMS.ReadComponent(ACopyOfComponentChild); except raise Exception.Create('Fehler beim Kopieren des Objektes'); end; finally locMS.Free; end; end; Vielleicht kannst was damit anfangen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz