8
votes

Copier une classe à une autre?

J'ai xxx

Comment puis-je copier A à un autre A? En C ++, je sais que je pouvais faire * A1 = * A2; . Y a-t-il quelque chose de similaire dans C #? Je sais que je pouvais écrire une solution générique à l'aide de la réflexion, mais j'espère que quelque chose existe déjà.

Je envisage de changer A à une structure nullable.

Étape 2 Je dois faire xxx

et copier les données de base de b à c.


5 commentaires

Vous avez déjà demandé ici ici: PMichaels.net/2016/03/04/...


8 Réponses :


4
votes

En supposant que A est juste une classe simple, vous pouvez faire

A newA = instanceOfA.MemberwiseClone();


2 commentaires

Bien que cela ne puisse être aussi rapide qu'une approche non-réflexion.


D'accord. Il peut être plus pratique et plus évolutif qu'une approche personnalisée cependant.



4
votes

Il y a l'interface iClonable qui offre une méthode clone () .

clone sur MSDN.


0 commentaires

0
votes

Vous pouvez cloner, vous pouvez définir un constructeur de copie. Pourquoi changer la classe en structure juste parce que dans C ++, vous pouvez faire quelque chose en 10 caractères. C # est différent. Les structures ont des avantages et des inconvénients.


0 commentaires

3
votes

Ajoutez les constructeurs appropriés:

class Foo
{
    public Foo(int a, string b)
    {
        A = a;
        B = b;
    }

    public Foo(Foo other)
    {
        A = other.A;
        B = other.B;
    }

    public int A { get; set; }
    public string B { get; set; }
}


4 commentaires

+1 Si j'avais suffisamment de votes aujourd'hui. Immutable n'impliquerait aucune propriété définie, non?


@LPTHNC: Set privé le ferait.


Merci. Comment allez-vous déclarer que si vous voulez continuer à obtenir comme public - sur la même ligne ou séparément?


@Ipthnc: public int a {obtenir; ensemble privé; }



8
votes

J'ai utilisé la sérialisation binaire. Fondamentalement, sérialisez l'instance à un flux de mémoire. Ensuite, désérialisez-le hors du flux de mémoire. Vous aurez une copie binaire exacte. Ce sera une copie profonde, plutôt qu'une copie peu profonde. xxx

pour une copie peu profonde, vous pouvez utiliser objet.memberwiseclone


3 commentaires

+1 pour cette méthode. Nous avons utilisé cela plusieurs fois et cela fonctionne bien.


Il ressemble à un objet.MemberWiseclone fonctionne uniquement avec les deux classes sont les mêmes et dans la méthode de la classe? Comment puis-je programmer MyserializationMethod? Il semble que je vais utiliser la réflexion.


Quelqu'un l'a posté ci-dessous: C-Sharpcorner.com/uploadfile/sd_surajit/cloning0503200701262 0 am/... aucune réflexion nécessaire




7
votes

Voici un code simple qui fonctionne sur n'importe quelle classe, pas seulement de base. XXX


0 commentaires

2
votes

Nous avons utilisé ce code avec succès:

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace Utility {
    internal static class ObjectCloner {
        public static T Clone<T>(T obj) {
            using (MemoryStream buffer = new MemoryStream()) {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(buffer, obj);
                buffer.Position = 0;
                T temp = (T)formatter.Deserialize(buffer);
                return temp;
            }
        }
    }
}


0 commentaires