2017-06-19 1 views
1

ディープコピーメソッドを実装しました。このメソッドにステップインします。クラスは期待どおりにコピーされます。ディープコピーはメソッドにステップインするときにのみ正常に動作します

ただし、メソッドをステップ実行してクラスインスタンスを検査すると、一部のプロパティが正しくコピーされません。

Profile profile = new Profile(); 
profile = Model.Copy<Profile>(Profile.GetProfileById(ProfileID)); 
profile.Save(); 

上記のコードは、クラスインスタンスが作成され、コピーが呼び出された場所を示しています。

データベースに準拠しているため、コピーするプロファイルにはAddressCollectionという2つの項目があります。

profile.Save()行にブレークポイントを置き、コピーメソッドをステップオーバーすると、インスタンスが正しくコピーされず、AddressCollectionプロパティに0個の項目があります。

実際にコピーメソッドに入ると、インスタンスは正しくコピーされ、AddressCollectionが2つの項目で返されます。

コピー方法

public T Copy<T>(T oldObject) where T : CRMBusinessObjectBase 
{ 
    return Copy<T>(oldObject, null, null); 
} 

public T Copy<T>(T oldObject, CRMBusinessObjectBase parentObject, string parentProperty) where T : CRMBusinessObjectBase 
     { 
      //Create copy of business object 
      T copy = null; 

      System.Runtime.Serialization.Formatters.Binary.BinaryFormatter sz = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 

      //Serialize and then deserialize to a new object 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       sz.Serialize(ms, oldObject); 
       ms.Position = 0; 
       copy = (T)sz.Deserialize(ms); 
      } 

      //Set business object as new 
      copy.SetAsNew(); 

      //Set parent property if specified 
      if (parentObject != null && !string.IsNullOrEmpty(parentProperty)) 
      { 
       copy.GetType().GetProperty(parentProperty).SetValue(copy, parentObject, null); 
      } 

      return copy; 
     } 

私は運なしDataContractSerializerを使用するBinaryFormatterを変更しようとしています。 私はまた、シリアル化の代わりにリフレクションを使用しようとしましたが、同じ問題が発生します。

問題がどこにあるかわからない。コピー enter image description here

+0

おそらくプロパティは「Serializable」として帰属されませんか? –

+0

クラスは 'Serializable'です。これはプロパティには適用できません – DNKROZ

+0

あなたはそうです。ごめんなさい。しかし、シリアライズ可能でないか、または非シリアライズ可能と見なされるいくつかのタイプの属性を持つことができます。しかし、私はあなたがすでにそれをチェックしたと思うだろう –

答えて

2

この問題は、可能性の高いウォッチウィンドウの使用に関連する、またはデバッグ中の変数の上にマウスを移動された後、コピー enter image description here

スクリーンショット

http://dotdotnet.blogspot.com.au/2010/04/lazy-load-eager-debugging.htmlを参照してください:

もう一つは、そのデバッガで、ウォッチウィンドウは、すべての怠惰の原因となる各プロパティの値を評価する をしようとするため、具体的Visual Studioのウォッチ ウィンドウが遅延ロードに非常に友好的ではありません ロードするプロパティをロードします。

関連する問題