3


2

Entityをディープコピーしたいのですが、そのための最善の方法を探しています。 パフォーマンスも気になります。

私はClone()が基本的にシャドウコピーとすべての参照のクローンを作成するICloneableを実装している私のすべてのエンティティを持つことを計画しています。

例えば:

[DataContract()]
クラスMyEntity {public int id;パブリック文字列名。 public EntitySet myOtherEntity; }

MyEntity Clone(){エンティティent = new Entity(); ent.name = this.name; ent.myOtherEntity = this.myOtherEntity.Clone(); entを返します。 }

それは良いやり方ですか? または、エンティティにlinqをロードし、すべての主キーを削除して(idを0に設定し)てからCreate(entity)関数を使用して複製する必要がありますか? リフレクションも有効な解決策ではありますか(遅すぎない)。 Clone関数を更新せずに私のエンティティクラス(例えば新しいメンバ)を更新するとき、少なくともリフレクションは問題を回避することができます…​

2 Answer


0


ICloneableは悪い解決策ではありません。結局のところ、それはこの目的のために設計されました。 私がすべてのエンティティタイプの実装を書きたいかどうかはわかりませんが、コードジェネレータを使用してこれを回避することができます。 ただし、循環参照は慎重に行ってください。 しかし、これを行うときにパフォーマンスをまったく気にしていないのであれば、おそらくそれはあまりにも頻繁にやっていることでしょう。 ここでパフォーマンスが問題になるのであれば、実際にどのような問題を解決しようとしているのかを知りたいと思います。


0


あなたはこの機能を試すことができます:

プライベート静的オブジェクトCloneObject(object obj){型cloneType = obj.GetType();

オブジェクトclone = Activator.CreateInstance(cloneType);

PropertyInfo [] properties = cloneType.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty); foreach(プロパティのPropertyInfoプロパティ){if(property.CanWrite){object value = property.GetValue(obj、null); property.SetValue(clone、value、null); }}

クローンを返します。 }

そして

Entity newEnt = new Entity(); newEnt =(Entity)CloneObject(oldEnt);