none
accéder à une sous propriété via une chaine de caractère RRS feed

  • Question

  • Bonjour,

    Je suis en train de dévelloper en vb.net, et j'aurais besoin d'accéder à une sous-propriété d'un objet en connaissant le chemin et la valeur que je dois doner à cette propriété.

    Concrétement, j'ai un objet mon_objet, ayant une propriété prop1 qui a elle-même une sous-propriété prop2

    J'aurais besoin de savoir comment coder une sub à qui j'envoie comme argument (mon_objet,"prop1.prop2",value) 

    et qui fasse mon_objet.prop1.prop2=value

    Merci pour l'aide

    vendredi 12 juin 2015 10:25

Réponses

  • Bonjour,

    POur faire cela, vous pouvez utiliser la réflexion.

    Récupéré une property peut se faire avec des fieldInfo:

    FieldInfo

    Après, pour être honnête, quand on commence a en arriver la, il faut peut etre se poser une question sur le design de votre projet.

    La reflexion est utilisée a toute petite dose pour des cas bien précis mais on peut souvent résoudre le problème en revoyant le modèle objet de l'application.

    Cordialement

    Cédric

    vendredi 12 juin 2015 12:03
  • Bonjour,

    Un petit exemple vite fait :

        class Program
        {
            static void Main(string[] args)
            {
                var personne = new Personne
                {
                    Voiture = new Voiture {Nom = "Renault"}
                };
    
                Console.WriteLine("Nom = {0}", personne.Voiture.Nom);
                MaFonction(personne, "Voiture.Nom", "Ferrari");
                Console.WriteLine("Nom = {0}", personne.Voiture.Nom);
    
                Console.ReadLine();
            }
    
            public static void MaFonction(Personne personne, string propName, object newValue)
            {
                // suppose que 2 profondeurs
                var props = propName.Split('.');
                var firstProp = personne.GetType().GetProperty(props[0]);
                var voiture = firstProp.GetValue(personne);
                var secondProp = voiture.GetType().GetProperty(props[1]);
                secondProp.SetValue(voiture, newValue);
            }
        }
    
        public class Personne
        {
            public Voiture Voiture { get; set; }
        }
    
        public class Voiture
        {
            public string Nom { get; set; }
        }

    Maintenant je suis d'accord avec Cedric : c'est louche de vouloir faire comme ça ;-)


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    dimanche 14 juin 2015 08:36

Toutes les réponses

  • Bonjour,

    POur faire cela, vous pouvez utiliser la réflexion.

    Récupéré une property peut se faire avec des fieldInfo:

    FieldInfo

    Après, pour être honnête, quand on commence a en arriver la, il faut peut etre se poser une question sur le design de votre projet.

    La reflexion est utilisée a toute petite dose pour des cas bien précis mais on peut souvent résoudre le problème en revoyant le modèle objet de l'application.

    Cordialement

    Cédric

    vendredi 12 juin 2015 12:03
  • Bonjour,

    Un petit exemple vite fait :

        class Program
        {
            static void Main(string[] args)
            {
                var personne = new Personne
                {
                    Voiture = new Voiture {Nom = "Renault"}
                };
    
                Console.WriteLine("Nom = {0}", personne.Voiture.Nom);
                MaFonction(personne, "Voiture.Nom", "Ferrari");
                Console.WriteLine("Nom = {0}", personne.Voiture.Nom);
    
                Console.ReadLine();
            }
    
            public static void MaFonction(Personne personne, string propName, object newValue)
            {
                // suppose que 2 profondeurs
                var props = propName.Split('.');
                var firstProp = personne.GetType().GetProperty(props[0]);
                var voiture = firstProp.GetValue(personne);
                var secondProp = voiture.GetType().GetProperty(props[1]);
                secondProp.SetValue(voiture, newValue);
            }
        }
    
        public class Personne
        {
            public Voiture Voiture { get; set; }
        }
    
        public class Voiture
        {
            public string Nom { get; set; }
        }

    Maintenant je suis d'accord avec Cedric : c'est louche de vouloir faire comme ça ;-)


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    dimanche 14 juin 2015 08:36