2010-03-31 5 views
3

J'ai un aspic: ImageButton avec onclick = « Btn_OnClick ».
Dans Btn_OnClick J'ai cette ligne:C# - En utilisant une copie des variables de session stockées au lieu de référence

DataTable dtTable = (DataTable)Session["someSessionKey"] 

et dtTable est modifiée dans la fonction.

J'ai remarqué que si le bouton est cliqué plus d'une fois, le dtTable que je prends de la session contient la table modifiée, ce qui signifie probablement que dtTable n'est pas une copie mais une référence de la variable de session.

Comment puis-je modifier une copie de la session [ « someSessionKey »], et non la valeur réelle?
Merci!

Répondre

5
DataTable dtTable = ((DataTable)Session["someSessionKey"]).Copy(); 
+0

Le problème est que ce dtTable ne contient rien après le clone(). Juste une table vide. Si je ne le clone pas, c'est bon. – Nir

+0

Oups, désolé. La réponse est maintenant corrigée. – svinto

+0

Merci beaucoup! :-) – Nir

2

Si l'objet de la session met en œuvre ICloneable, vous pouvez utiliser var myCopy = mySessionObject.Clone();. Vous devriez alors lire la documentation de l'objet pour voir ce qu'il fait exactement.

Ceci est parce qu'il n'y a pas de solution générique pour le clonage. Généralement, les objets ont d'autres objets non scalaires en tant que propriétés. Par conséquent, cela dépend toujours du scénario si vous avez également besoin de cloner ces objets enfants. Lorsque vous créez votre propre classe, vous pouvez toujours appeler la méthode MemberwiseClone() protégée définie dans System.Object pour obtenir un clone plat. Vous pouvez ensuite choisir si vous souhaitez ajouter une logique de clonage supplémentaire et si vous souhaitez la rendre disponible pour les appelants à l'extérieur. Si l'objet de la session est un List<T> ou un IEnumerable<T>, vous pouvez le faire var myCopiedList = new List<T>(myListInSession);. Gardez à l'esprit que les objets individuels dans cette liste sont et non cloné dans ce cas. Vous devez les traverser et cloner manuellement chaque objet. C'est similaire avec le DataTable. Vous devrez peut-être créer manuellement une nouvelle instance et copier le contenu.

Pour cloner manuellement un objet qui ne vous aurait pas de méthode soutien public de le faire pour créer une nouvelle instance. Ensuite, vous affectez manuellement toutes les propriétés de l'objet d'origine à l'objet cloné. Cela peut être non seulement fastidieux, mais cela ne fonctionnera pas souvent parce qu'il y a des membres protégés auxquels vous ne pouvez accéder facilement.

Enfin, vous pouvez recourir à la réflexion ou d'autres astuces pour essayer de cloner un objet. Une recherche google rapide m'a donné ce résultat: C# Object clone wars.

Questions connexes