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 :

Types non connu avant lancement du programme


Sujet :

C#

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Août 2014
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Types non connu avant lancement du programme
    Bonjour,

    Je suis exposé à un problème :
    - Le type de la variable est inconnue avant lancement du programme.
    Elle est connue par la suite dans le programme selon un paramètre placé par l'utilisateur.

    Pour l'instant selon le paramètre entré par l'utilisateur j’obtiens une variable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Type catalogue = typeof(Catalogue<Element>);
    Je souhaiterais créer l'objet de ce type, afin de pouvoir utiliser les méthodes qui lui sont associées.
    J'ai lu qu'il était possible d'utiliser la réflexion à ce sujet, elle est mise en place mais ne me convient pas totalement...

    -L'utilisation de la réflexion est lourde, de plus toute la suite du programme qui utilise l'objet crée en réflexion doit utiliser aussi la réflexion.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MethodInfo methodeSansGenerique = typeof(JsonConvert).GetMethod("DeserializeObject", new[] { typeof(string) }, true);
    MethodInfo methodeAvecGenerique = methodeSansGenerique.MakeGenericMethod(catalogue);
    var catalogueElement = methodeAvecGenerique.Invoke(null, new object[] { "{//Contenu du fichier JSON supprimé pour la clarté...}" });
    Je me demandais si quelqu’un avait une solution à ce problème, je suis encore débutant en C# et en Framework .NET.

    Merci à vous !

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 766
    Points
    766
    Par défaut
    Tu pourrais regarder du côté des variables dynamic. Le type n'est pas connu à la compilation.
    Les fautes d'orthographes sus-citées sont déposées auprès de leurs propriétaires respectifs. Aucune responsabilité n'est engagée sur la lisibilité du message ou les éventuels dommages qu'il peut engendrer.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Août 2014
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci, je vais essayer de regarder de ce côté.

  4. #4
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Bonjour.

    Tu as deux problèmes.
    a) Celui de l'initialisation (et là on ne peut pas faire très différemment: soit on garde l’introspection réflexion et tu peux au mieux mettre en cache, soit tous les types possibles sont connus à l'avance et tu utilises un switch).
    b) Le fait que tu aies besoin de l'introspection pus tard. Cela est anormal. Normalement tes objets devraient avoir une classe de base ou une interface commune et c'estbpar elle que tu devras les manipuler. Je ne vois aucune raison qui justifieraient d'utiliser l'introspection tout du long.

    Note que dynamic utilisera de façon transparent l'introspection. Mais tu ne pourras pas l'utiliser pour appeler des méthodes de JsonConvert.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Août 2014
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Oui... je me dis que j'ai peut-être une mauvaise conception du problème.

    En réalité l'utilisateur choisi un mode au lancement du programme. Seulement 5 modes sont possibles.

    Est établi alors un catalogue qui contient des éléments associés à ce mode.

    Les éléments du catalogue se trouve dans un fichier JSON différent selon le mode qui permet de construire le catalogue correspondant.

    (A noter que la méthode DeserializeObject() de JsonConvert peut être utilisée sans générique pour renvoyer un object selon un type placé en paramètre.)


    Puis-je utiliser un switch dans ce cas ? (Si oui, pouvez vous me donner des précisions car j'ai un peu de mal sur ce point...)


    D'autre part les objets éléments du catalogue disposent en effet d'un classe abstraite commune, peut-être une incompréhension de ma part sur ce point de polymorphisme... ? Je ne vois pas comment faire...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    Il faut se poser la question à savoir pourquoi ton application ne pourrait pas connaitre tous les types...

    S'il faut absolument que l'application puisse s'adapter à une liste de types changeante (et dont la nature des types pourrait aussi changer) sans que l'application ne soit modifiée, il existe quand même des patterns qui pourraient t'aider à accomplir ton objectif.

    Premièrement, si les méthodes invoquées sont toujours les mêmes, alors définis-toi une interface qui est obligatoirement implémentée par les types acceptés par ton application.

    Par example, j'ai une application qui accepte des documents de toutes sortes qui sont utilisés dans un thread secondaire afin de contruire automatiquement des regroupement de plans 3D en PDF. J'ai simplement créé une interface IPDFJoinable qui forme l'implémentation d'un broadcast à un helper qui regroupe tous les fichiers. J'ai une douzaine de types de fichiers différents qui sont interceptés et je n'ai jamais eu à modifier le code du worker. Le worker quant à lui invoque les méthodes appropriées et découvre au runtime la présence de propriétés.

    Deuxièment, tu pourrais aussi créer un web service qui agit comme dictionnaire de type. Au lancement de ton application, tu polls le web service comme connaitre la nature des types que l'application accepte et le reste n'est plus que de la sérialization... Tu pourrais alors 'pousser' des comportements en invoquant des librairies dynamiques ou des web services. Dans une application windows de type plugin, tu n'as même pas à redéployer ton application. Tu mets toute ta logique changeante dans des plugins que tu déposes physiquement au besoin où l'application se trouve...

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Août 2014
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Bonjour merci de la réponse, je suis toujours bloqué...

    L'application connait tous les types en fait mais le type est choisi selon ce que veut l'utilisateur.

    En fait il doit y avoir quelque chose que je loupe dans le polymorphisme et interfaces à cause des types génériques....

    Voici le code simple quand le code ne comporte pas les classes qui peuvent changer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Catalogue<Element, SuperElement> catalogueElement = JsonConvert.DeserializeObject<Catalogue<Element, SuperElement>>("{//Contenu du fichier JSON supprimé pour la clarté...}" });
    catalogueElement.NombreElements();
    SuperCatalogue<SuperElement> superCatalogueElement = catalogueElement.ConvertirEnSupercatalogue();
    superCatalogueElement.Traiter();
    Je ne souhaite pas passer par un service web.

  8. #8
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Vu ton problème, au cours de ton programme tu ne devrais avoir à manipuler que les classes mères (ou des interfaces). Autrement dit peu importe que tu désérialises une liste de chats ou de chiens, l'essentiel est que tu retournes une liste d'animaux. Et c'est une liste d'animaux que tu manipuleras tout au long du programme, sans savoir s'il s'agira à l'exécution de chats ou de chiens.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Août 2014
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci DonQuiche de m'avoir rappeler ça.

    J'ai maintenant le résolu le problème en ajoutant une interface et en utilisant les classes mères pour les éléments. J'avais un problème surtout au niveau du catalogue (mais avec l'interface c'est bon).


    Merci encore à tous ceux qui ont tenté de m'aider.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Type variable non connu à la compilation
    Par jo_dalton dans le forum C#
    Réponses: 6
    Dernier message: 20/02/2008, 02h39
  2. Réponses: 2
    Dernier message: 15/12/2007, 16h52
  3. [VBA-E] taille du tableau non connu
    Par fab101 dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 26/07/2005, 15h51
  4. [DCOM] Accès refusé au lancement du programme à distance
    Par raoulmania dans le forum Web & réseau
    Réponses: 7
    Dernier message: 22/06/2005, 13h01
  5. Valeur d'un champ non connu
    Par Pierre FORAZ dans le forum XMLRAD
    Réponses: 2
    Dernier message: 11/10/2004, 11h08

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