IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Initialisé l'objet enfant depuis l'objet parent


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut Initialisé l'objet enfant depuis l'objet parent
    Bonjour,

    un cas que je rencontre souvent en C# mais dont je n'ai pas de solution "magique" pour le faire.

    J'ai un object B héritant de A, je voudrais crée une instance de mon Objet B à partir d'une instance d'Objet A, voici ma solution actuellement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    public class A
        {
     
            [JsonProperty("id")]
            public int Id { get; set; }
     
            [JsonProperty("key")]
            public string Key { get; set; }
     
            [JsonProperty("name")]
            public string Name { get; set; }
     
            [JsonProperty("title")]
            public string Title { get; set; }
     
            public A() {
            }
     
            public A(A a)
            {
                this.Id = a.Id;
                this.Key = a.Key;
                this.Name = a.Name;
                this.Title = a.Title;
            }
        }
     
       public class B: A
        {
            public bool Discover { get; set; }
     
            public string Clue1 { get; set; }
     
            public string Clue2 { get; set; }
     
            public B() { }
     
            public B(A a):base(a)
            {
            }
        }
     
     // et donc je crée une instance de ma classé B comme ça
      B b=new B(a);
    Y'a t'il un moyen plus simple de faire ça sans me taper toutes les propriétés dans le constructeur de mes classes et sans passer par la réflexion ?

    Ou peut être que je devrais juste me crée un outil qui fait le boulot à ma place ?

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Dans ton exemple nous ne savons pas ce qu'est 'a' dans 'B b=new B(a);' peut tu compléter ?

    Si je comprend :
    Tu as une class B qui hérite de A.
    Tu as instancié un objet A et tu souhaite le convertir en objet B.

    Un objet B est aussi un objet A mais le contraire n'est pas vrai.
    Un objet A n'est pas un objet B donc il faut le convertir.

    Pour l'instant ce que je dit n'avance pas à grand chose, je vais réfléchir

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    a est une instance de A que j'obtiens grâce à une désérialisation Json:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    A a=JsonSerializer.DeserializeJsonFromFile<A>("A.txt");
    B b=new B(a);

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Je peut te proposer cela


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public class A
    {
        public string stra { get; set; }
        public T ConvertTo<T>() where T : A, new()
        {
            T obj = new T();
            Type t = this.GetType();
            foreach (System.Reflection.FieldInfo fieldInf in t.GetFields())
                fieldInf.SetValue(obj, fieldInf.GetValue(this));
            foreach (System.Reflection.PropertyInfo propInf in t.GetProperties())
                propInf.SetValue(obj, propInf.GetValue(this, null), null);
            return obj;
        }
    }
     
    public class B : A
    {
        public string strb { get; set; }
    }
     
    public class C : B
    {
        public string strc { get; set; }
    }
    Ça s'utilise comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    A a = new A();
    a.stra = "A";
     
    B b = a.ConvertTo<B>();
    b.strb = "B";
     
    C c1 = a.ConvertTo<C>();
    c1.strc = "C1";
     
    C c2 = b.ConvertTo<C>();
    c1.strc = "C2";

  5. #5
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    public T ConvertTo<T>() where T : A, new()
    Le paramètre générique doit être ou doit dérivé du type A.
    Nous pourrions nous en passer mais ça évite des exceptions en cas de conversion impossible.
    L'intellissense nous prévient donc immédiatement si il y à un problème.
    Il faudrait donc adapter cette valeur à chaque implémentation de ce mécanisme dans tes class.

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    J'ai hésité à l'implémenter dans une conversion implicit de la class . . . une autre idée.

    EDIT : Cela ne semble pas possible avec des classes dérivées

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/09/2012, 14h58
  2. Réponses: 3
    Dernier message: 30/01/2012, 18h52
  3. Réponses: 1
    Dernier message: 24/03/2011, 14h27
  4. Réponses: 1
    Dernier message: 08/08/2009, 01h46
  5. Réponses: 15
    Dernier message: 30/04/2008, 16h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo