2017-06-19 2 views
1

J'ai implémenté une méthode de copie en profondeur lorsque vous montez dans cette méthode - la classe est copiée comme prévu. Toutefois, si j'interviens sur la méthode et inspecte l'instance de classe, certaines propriétés ne sont pas copiées correctement.La copie en profondeur ne fonctionne correctement que lorsque vous entrez dans la méthode

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

Le code ci-dessus montre où l'instance de classe est créée et la copie est appelée.

Conformément à la base de données, le profil que je souhaite copier a deux éléments dans la propriété AddressCollection.

Si je place un point d'arrêt sur la ligne profile.Save() et que vous passez la méthode de copie, l'instance n'est pas copiée correctement et la propriété AddressCollection comporte 0 élément.

Toutefois, si je suis réellement dans la méthode de copie, l'instance est copiée correctement et renvoie le AddressCollection avec 2 éléments.

Copie Méthode

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; 
     } 

J'ai essayé de changer le BinaryFormatter d'utiliser un DataContractSerializer sans chance. J'ai également essayé d'utiliser la réflexion au lieu de la sérialisation et le même problème se produit.

Je ne sais pas trop où le problème pourrait être.

Captures d'écran

Avant la copie enter image description here Une fois la copie enter image description here

+0

Les propriétés ne sont peut-être pas attribuées comme 'Serializable'? –

+0

La classe est 'sérialisable', cela ne peut pas être appliqué aux propriétés – DNKROZ

+0

Vous avez raison. Pardon. Mais vous pourriez avoir des attributs de types qui ne sont pas sérialisables ou spécifiquement marqués comme des attributs non sérialisables. Mais je pense que vous auriez déjà vérifié que –

Répondre

2

Cette question est probablement liée à l'utilisation de la fenêtre Watch, ou planant au-dessus des variables pendant le débogage.

Voir http://dotdotnet.blogspot.com.au/2010/04/lazy-load-eager-debugging.html:

Une autre chose est que débogueur et en particulier Visual Studio fenêtre Espion est pas si amical à un chargement paresseux parce que la fenêtre Espion essayer d'évaluer la valeur de chaque propriété qui causent tous les paresseux chargement des propriétés à charger.