オブジェクト階層のクローニングにはいくつかの問題があります。これはモデリングアプリケーション用のツールキットで、ツールボックスにはクラスインスタンスがプロトタイプとして含まれています。しかし、私はこれら:)WPFコントロールとオブジェクト階層のクローニング
次のコードをクローニング苦労が問題を示していたよ:私は私のプロジェクトのワークシートへAContainingClass
のオブジェクトを挿入すると
public abstract class Shape {
protected List<UIElement> elements;
private Canvas canvas;
...
public Canvas getCanvas() { ... };
}
public class MovableShape : Shape {
protected ... propertyA;
private ... propertyXY;
...
}
public abstract class AbstractLayout : MovableShape, ... {
...
}
public class SomeLayoutClass : AbstractLayout, ... {
...
}
public class AContainingClass {
SomeLayoutClass Layout { get; set; }
...
}
、それをクローン化する必要があります。これまでは手動クローニング(基本クラスのprivate
フィールドのため失敗しました)とバイナリシリアル化(BinaryFormatter
とMemoryStreams
)を試しました。
が[Serializable]
ではないため、最初の方法ではbase.clone()
メソッドを呼び出す方法がありません(または間違っていますか?)、後者は機能しません。
注:ディープコピーである必要があります。
アイデア?ありがとう!
UPDATE
ちょうど私のマニュアルクローニングアプローチを明確にする:各クラスは、基本クラスのClone
メソッドを呼び出すためにどのようにそれ自身のClone
方法を、持っている場合は を?
public class Shape { // not abstract any more
...
public Shape Clone() {
Shape clone = new Shape() { PropertyA = this.PropertyA, ... };
...do some XamlWriter things to clone UIElements...
return clone;
}
}
public class MovableShape : Shape {
...
public MovableShape Clone() {
// how to call base.Clone???
// this would be required because I have no access to the private fields!
}
}
、手動のクローン作成は、まったく動作しないことができる、またはそれだけで扱いにくいましたか?民間の状態は公的な状態に対応していないのですか?扱いにくい場合は、リフレクションベースのコード生成を使用することをお勧めします。それ以外の場合、これらの欠点を修正するためにコードを複製することはオプションですか?ライブラリはオープンソースですか?もしそうなら、パッチを提出してオブジェクトをクローン可能にすることができます。 –
@Merlyn Morgan-Graham:手動クローニング – Matten