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 :

Acceder à un object par son chemin


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2004
    Messages : 47
    Par défaut Acceder à un object par son chemin
    Bonjour,


    Je souhaite accéder à une propriété d'un objet de type 'object' mais sans connaitre le type.

    J'enregistre mon chemin d'accès dans un fichier, je le lit, et j'ouvre mon objet et le lit.

    J'image un code du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    string chemin = "Results.Item[0].Score";
     
    object monObjectSource; //créé dans un autre bout du programme
     
    object resultat = GetProperty(monObjectSource, chemin);
    Un des problèmes c'est qu'il peut y avoir des collections dans le chemin.

    Merci de votre aide.

    Vincnet

  2. #2
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Si tu es prêt à tirer une dépendance sur WPF et que les perfs ne sont pas un souci tu peux utiliser l'infrastructure de data-binding.

    Voici un petit POC :
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    class ScoreContainer
    {
        public int Score { get; set; }
    }
     
    class ResultContainer
    {
        public ScoreContainer[] Item { get; set; }
    }
     
    class Container
    {
        public ResultContainer Results { get; set; }
    }
     
    class Program
    {
        static object GetProperty(object source, string path)
        {
            DependencyProperty property = DependencyProperty.Register("Value", typeof(object), typeof(DependencyObject));
     
            DependencyObject destination = new DependencyObject();
     
            Binding binding = new Binding
            {
                Source = source,
                Path = new PropertyPath(path),
                Mode = BindingMode.TwoWay
            };
     
            BindingOperations.SetBinding(destination, property, binding);
     
            return destination.GetValue(property);
        }
     
        static void Main(string[] args)
        {
            string chemin = "Results.Item[0].Score";
     
            object monObjectSource = new Container
            {
                Results = new ResultContainer
                {
                    Item = new[]
                    {
                        new ScoreContainer
                        {
                            Score = 123
                        }
                    }
                }
            };
     
            object resultat = GetProperty(monObjectSource, chemin);
     
            Console.WriteLine(resultat);
        }
    }
    (Ça peut être optimisé avec mise en cache du binding dans un dico)
    Oui je sais
    Autant de le dire de suite c'est un détournement un peu outrancier, mais ça fonctionne parfaitement (heureusement pour WPF).

    Sinon je te conseille de faire un petit parseur qui utilisera la réflexion.
    Si tu te contentes de ne pas être complètement générique (e.g. ne pas gérer tous les indexeurs) ça ne devrait pas être trop compliqué...

  3. #3
    Membre Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Par défaut
    En utilisant System.Web tu peux utiliser le DataBinder
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Web.UI.DataBinder.Eval(obj, "Results.Item[0].Score");
    Tu peux aussi utiliser CodeFluent Runtime
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CodeFluent.Runtime.Utilities.DataBindingEvaluator.Eval(obj, "Results.Item[0].Score")

Discussions similaires

  1. Réponses: 8
    Dernier message: 19/07/2010, 15h50
  2. Difficulté à ouvrir un fichier par son chemin
    Par sebac dans le forum Langage
    Réponses: 3
    Dernier message: 14/04/2010, 16h51
  3. Inclure un fichier par son chemin absolu
    Par anisj1m dans le forum Balisage (X)HTML et validation W3C
    Réponses: 15
    Dernier message: 03/07/2009, 14h23
  4. inclure un fichier par son chemin absolu
    Par anisj1m dans le forum JSF
    Réponses: 3
    Dernier message: 02/07/2009, 10h40
  5. Acceder à un widget par son nom
    Par uriotcea dans le forum Qt
    Réponses: 2
    Dernier message: 21/05/2008, 08h52

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