copie d'une classe, C#
Est-il un moyen de copier une classe en C#? Quelque chose comme var dupe = Maclasse(original).
- La Question n'est pas claire. Vous parlez d'objets, et non des classes, et vous devrait clarifier la sémantique que vous voulez, tant que Groo a dit stackoverflow.com/questions/184710/...
- Une possibilité est d'utiliser la réflexion pour créer une méthode générique de le faire pour vous: pmichaels.net/2016/03/04/...
Vous devez vous connecter pour publier un commentaire.
Vous êtes probablement parler d'une copie en profondeur (copie en profondeur vs copie superficielle)?
Vous devez:
[Serializable]
attribut.Pour obtenir une copie, vous pouvez utiliser le
Object.MemberwiseClone()
méthode, mais c'est une méthode protégée, ce qui signifie que vous ne pouvez l'utiliser que de l'intérieur de la classe.Avec tous les copie en profondeur les méthodes, il est important de considérer toutes les références à d'autres objets, ou les références circulaires, ce qui peut entraîner la création d'une meilleure copie que ce que tu voulais.
[Serializable]
. Sinon, vous devrez utiliser d'autres implémentations.Pas toutes les classes ont cette fonctionnalité. Probablement, si une classe est le cas, il fournit une
Clone
méthode. Pour aider à mettre en œuvre cette méthode pour vos propres classes, il y a unMemberwiseClone
protégé méthode définie dansSystem.Object
qui fait une copie de l'instance courante (c'est à dire les champs sont copiés; s'ils sont des types référence, la référence pointe vers l'emplacement d'origine).Si votre classe a juste obtenu propriétés, vous pourriez faire quelque chose comme ceci:
Si vous avez des champs et des méthodes, je suis sûr que vous pouvez les recréer dans la nouvelle catégorie à l'aide de réflexions. Espérons que cela aide
Oui et non. C'est une zone où vous devez être un peu prudent, car il ya quelques pièges (et encore, il n'est pas difficile).
Tout d'abord, si vous fouiner dans la Bibliothèque de classes de Base (BCL) un peu, vous découvrirez peut-être le Interface ICloneable. Pas tous les types d'implémenter cette interface, mais ceux qui ont une méthode Clone qui va renvoyer une nouvelle instance du même type avec (sans doute) les mêmes valeurs.
Cependant, c'est un piège: L'interface ICloneable ne précise pas suffisamment si une profonde clone ou un clone simple est prévu, de sorte que certaines implémentations de faire une chose, et d'autres implémentations de l'autre. Pour cette raison, ICloneable n'est pas beaucoup utilisé, et son utilisation est activement découragé - voir l'excellent Cadre Des Lignes Directrices De Conception pour plus de détails.
Si vous creusez plus loin dans la BCL, vous pouvez découvrir ce Système.Objet a la protégée MemberwiseClone méthode. Si vous ne pouvez pas appeler cette méthode directement à partir d'un autre type, vous pouvez utiliser cette méthode pour mettre en œuvre le clonage dans vos propres objets.
Une commune de clonage modèle est de définir un cadre protégé, le constructeur de la classe que vous voulez cloner et de passer un déjà existant instance en tant que paramètre. Quelque chose comme ceci:
Cependant, qui de toute évidence ne fonctionne que si vous contrôlez le type que vous souhaitez cloner.
Si vous souhaitez cloner un type que vous ne pouvez pas modifier, et qui ne fournit pas une méthode Clone, vous aurez besoin d'écrire du code explicitement copie chaque morceau de données à partir de l'ancienne à la nouvelle instance.
Je pense que l'auteur se pose au sujet de la copie des constructeurs...
La réponse est "oui, mais seulement si vous implémentez-le vous-même", il n'y a pas "automatique" de moyen de le faire sans une forte cludges (lit: de la Réflexion):
L'autre chose à noter à cet égard est la
IClonable
de l'interface et de la.Clone()
méthode de cette offre. Aussi.MemberwiseClone()
protégé méthode prévue par leObject
classe peut aider à la mise en œuvre de ces deux méthodes.Comment sur avec JSON?
Vous pouvez obtenir JSON forfait à partir de : https://www.nuget.org/packages/Newtonsoft.Json/
Pas tout simple qui le sera toujours. Si votre classe est
[Serializable]
ou met en œuvreISerializable
, vous pouvez faire un aller-retour de la sérialisation pour créer une copie identique. Les mêmes travaux pour[DataContract]
Si vous ne souhaitez qu'une copie, vous pouvez essayer de Objet.MemberwiseClone(). C'est une méthode protégée, et vous ne pouvez l'utiliser que de l'intérieur de la classe.
Si vous avez de la chance, la classe implémente
ICloneable
et vous pouvez simplement appeler leClone()
méthode.Une possibilité est de clone il. Vous devez implémenter l'interface
ICloneable
et laClone
méthode.Entendez-vous un constructeur de copie, comme il existe en C++ ?
Il n'existe pas en C#.
Ce que vous pouvez faire est d'écrire votre propre (ce qui est fastidieux), ou vous pouvez écrire un "Clone" de la méthode qui utilise la sérialisation de créer une nouvelle instance qui a exactement les mêmes valeurs que celles de la classe d'origine.
Vous pouvez sérialiser l'instance actuelle, le désérialiser, et le retour de la désérialisé résultat. L'inconvénient est que votre classe doit être Sérialisable.
Un moyen facile de cloner un objet est écrit dans un flux et de le lire de nouveau:
Mais être conscient, que cela peut causer des problèmes avec ce qu'on appelle globale de l'objet.
Comment au sujet de quelque chose comme:
Ou si vous avez aussi besoin de copier quelque chose généralement pas connus lors de la construction d'un nouvel objet:
Appel à l'aide:
~~~
Certaines des solutions raisonnables, ici, la sérialisation est un moyen valable d'aller à ce sujet ainsi qu'une méthode clone pour chaque classe.. Fouettée et Cela semble fonctionner pour les quelques tests que j'ai fait sur elle
}
Et voici la version plus détaillée, je suppose, au-dessus vous propose de comprendre les Expressions Lambda qui n'est pas commun. Si vous respectez la lisibilité (ce Qui est totalement valide) de plus je voudrais utiliser ci-dessous
}
Utiliser cette méthode pour dresser la liste des biens pour voir si elle a copié à nouveau référence.. simple, il n'a pas de propriétés de la liste d'aucun primitives(types structurés).. si vous obtenez un nom de classe