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 :

Créer un objet à l'aide d'une chaîne, genre : AllEnemy.Add(new "loup");


Sujet :

C#

  1. #1
    Invité
    Invité(e)
    Par défaut Créer un objet à l'aide d'une chaîne, genre : AllEnemy.Add(new "loup");
    Salut programmeurs, programmeuses, allons droit au but !!

    Comme le dit le titre, y'a-t-il un moyen de pouvoir créer des objets, en C#, à l'aide d'une chaîne ?

    En JavaScript, par exemple il est possible de faire référence à une variable de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $('ma_variable').style.fontSize = '20px';
    Est-ce possible en C# ?
    Si oui, alors quelqu'un aurait-il une solution ?
    Je vous remercie d'avance et vous remercierai peut-être une 2ème fois.
    Merci.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Points : 780
    Points
    780
    Par défaut
    Citation Envoyé par jamaliss Voir le message
    Comme le dit le titre, y'a-t-il un moyen de pouvoir créer des objets, en C#, à l'aide d'une chaîne ?
    Dis comme ça je réponds "Reflexion"

    Mais je ne crois pas que ce soit exactement ton besoin...
    J'ai la sensation que tu tentes de transcoder d'une mauvaise manière ce qui se fait dans un langage et pas dans l'autre...

  3. #3
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Ta question c'est comment créer un objet à partir d'une chaîne mais vu ton exemple j'ai plutôt l'impression que la vraie question c'est comment stocker des objets et y accéder par la suite via une chaîne.

    Pour la première question je dirais Activator.CreateInstance

    Pour la seconde, un dictionnaire associant une chaîne à un objet (classe Hashtable ou, si possible, la classe générique Dictionary<K,V> à partir du framework 2.0 minimum).
    Pas de questions techniques par MP

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci de m'avoir répondu (j'ai tenu à ma promesse^^).
    Le Dictionnary c'est interessant je vais voir ce que ça donne.

    Reste à savoir si en ce qui concerne la reflexion je suis dans la bonne voie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Type MyType = Type.GetType("Loup");
    MyType...
    AllEnemy.Add(new MyType());
    Sachant que j'utilise VS 2005 Express, Activator.CreateInstance ça fait partie que de .Net 3.5 n'est-ce pas ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Citation Envoyé par Chubyone Voir le message
    J'ai la sensation que tu tentes de transcoder d'une mauvaise manière ce qui se fait dans un langage et pas dans l'autre...
    Je plussoie !

    Pour revenir au probleme, garde bien en tete que le mecanisme de reflexion est quelque chose de couteux en terme de performance (et je ne parle pas de demi ticks en plus, c'est tres puissant mais bien lent comme il faut), donc regarde si, comme dit au dessus, tu ne pourrais pas essayer de transposer ta logique de maniere plus "Csharpy".

    Pour l'activator, il fait aussi parti du Fx 2.0 (quand tu regardes la doc sur MSDN, tu vois en haut "specific to 3.5 ... other versions [blabla]).

  6. #6
    Invité
    Invité(e)
    Par défaut
    Hello, SirJulio, "on s'est déjà vu" dans le forum de http://www.sfml-dev.org/index-fr.php.

    "Je plussoie" j'ai cherché dans le dictionnaire mais pas trouvé !

    Sinon comment peut-on savoir si la reflexion est couteuse en terme de performance ?
    Et que veux tu dire par plus "Csharpy" ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Je me disais bien que le pseudo me disait quelque chose. =)

    J'entends par la, que la reflexion (au dela du simple GetType()) est un mecanisme extremement puissant qui permet de faire des choses assez interressantes, mais toute cette technologie à un cout non negligeable.

    Pour faire un test rapide entre une instanciation "naturelle" et une instanciation par activator sur un 1 millions d'instances, tu obtiens 36 ms dans le premier cas, plus de 4 secs dans le second (rapport de plus de 100). Et encore, ce n'est qu'un petit exemple de ce que la reflexion permet.

    Mon point, et celui de chubyone aussi je pense, etant d'eviter de se servir de la reflexion pour simplement remplacer un mecanisme absent de C#, mais qui pourrait etre tourné autrement. Il arrive d'etre obligé d'avoir recours à la reflexion (genre "dans quelle methode je suis ?"), mais bien souvent tu peux faire autrement, et il vaut mieux. =)

    Pour revenir à ton probleme (je ne connais pas tes attentes mais c'est pour illustrer le propos), au lieu de jouer sur des strings de types, on pourrait imaginer une fabrique qui prendrait une enumeration en parametre pour te renvoyer un objet.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Points : 337
    Points
    337
    Par défaut
    Je pense moi aussi que tu tentes de faire quelque chose que tu pourrais à mon avis faire autrement et de manière typée...

    Tu pourrais nous dire ce que tu veux faire exactement?

  9. #9
    Membre régulier Avatar de Onlava
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Points : 112
    Points
    112
    Par défaut
    +1 pour la fabrique.

    En gros au final tu te retrouve avec qqch du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Creature creature = CreatureFactory.Request(CreatureType.Loup);
    AllEnemy.Add(creature);
    en considérant que class Loup : Creature

    a+
    XOR Onlava, Onlava

  10. #10
    Invité
    Invité(e)
    Par défaut
    En fait ce que j'aimerais faire c'est lire un fichier XML (donc des chaines) et extraire la liste de tous les mechants monstres à créer. De ce fait, en lisant le fichier j'ai un truc de ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    XmlNodeList MonsterList = doc.SelectNodes("/world/monsters/monster");
     
    foreach(XmlNode X in MonsterList)
    {
          AllEnemy.Add(new X.InnerText);
    }
    Ou bien vous préferez que je mette un code de ce genre (la méthode tout en bas) :

    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
     
     
        class EnemyList : List<Enemy>
        {
            public EnemyList():base()
            {
     
            }
            public void DrawEnemy()
            {
                foreach (Enemy E in this)
                {
                    E.DrawEnemy();
                }
            }
            public void AddEnemy(string name)
            {
                name = name.ToLower();
     
                if (name == "loup")
                    this.Add(new Loup());
                else if (name == "dragon")
                    this.Add(new Dragon());
                else if (name == "lion")
                    this.Add(new Lion());
     
            }
        }
    Est-ce que c'est plus Csharpy ?

  11. #11
    Membre régulier Avatar de Onlava
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Points : 112
    Points
    112
    Par défaut
    Tu devras tot ou tard comparer cette chaine à quelqchose pour savoir quel objet instancier, donc méthode #2. Par contre un switch serait plus zoli
    XOR Onlava, Onlava

  12. #12
    Invité
    Invité(e)
    Par défaut
    D'accord, Onlava, (et merci). Cela dit je sais qu'en C# le switch accepte les chaines genre :

    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
     
            public void AddEnemy(string name)
            {
                name = name.ToLower();
     
                switch (name)// <---- ici
                {
                    case "lievro": this.Add(new Lievro());
                        break;
                    case "mordur": this.Add(new Mordur());
                        break;
                    case "zabeille": this.Add(new Zabeille());
                        break;
                }//humm Lievro & Co ça me dit quelque chose !!
     
            }
    Tout d'abord est-ce le switch est plus performant que le if else if else ?
    Si oui, est-ce que le switch avec une chaîne c'est conseillé ?
    Ou vaut-il mieux utiliser le switch avec une enumération en parametre ?

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Avis personnel incomming :

    J'ai toujours preféré switcher sur des enums, AMHA il est beaucoup plus simple de matcher des entiers que des chaines de caracteres (cela dit je n'ai jamais fait le test). Pas de problemes de casses, de noms mal formés etc ..

    Pour les differences switch vs if else if, c'est negligeable à mon avis (à moins d'y passer 5000 par secondes pas vraiment d'interet, prends le plus clair pour ton code et voila).

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Points : 337
    Points
    337
    Par défaut
    Pitié

    Pas de switch pour une factory!!!

    Quand tu voudras ajouter de nouveaux monstres, tu devras ajouter les classes adéquates, et modifier le switch...

    Le jour où tu auras 2000 monstres, j'imagine même pas la taille du switch...

    Il existe d'autres solutions, à mon avis beaucoup plus propres.

    J'en détaille une sur mon blog.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par zoubidaman Voir le message
    Pitié

    Quand tu voudras ajouter de nouveaux monstres, tu devras ajouter les classes adéquates, et modifier le switch...

    Le jour où tu auras 2000 monstres, j'imagine même pas la taille du switch...
    Justement je pensais sans cesse à ce problème, interressante ton idée je vais lire ton article et essayer d'appliquer ce design pettern.
    Merci zoubidaman ainsi qu'à SirJulio & Co.
    (La discussion n'est pas fini !)

  16. #16
    Membre régulier Avatar de Onlava
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Points : 112
    Points
    112
    Par défaut
    Pitié

    Pas de switch pour une factory!!!

    Quand tu voudras ajouter de nouveaux monstres, tu devras ajouter les classes adéquates, et modifier le switch...
    Super article.

    Le seul problème que j'ai avec la reflection c'est la chute des performance. Sans oublier le boxing à tout va. Mais effectivement ça assoupli énormément le développement après coup.
    XOR Onlava, Onlava

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Points : 337
    Points
    337
    Par défaut
    Je n'ai pas fait de tests pour évaluer l'impact négatif des perfs de la reflexion dans ce cas là, mais je ne pense pas que ce soit si handicapant que ça puisqu'il n'y a que la création d'une instance "vide".

    Il faudrait tester...

Discussions similaires

  1. Importer un module à l'aide d'une chaîne de caractères
    Par rambc dans le forum Général Python
    Réponses: 2
    Dernier message: 21/11/2008, 17h04
  2. Créer un tableau à 2D et insérer une chaîne de caractères
    Par javamateur dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 18/03/2008, 10h16
  3. Créer un 'panel' à l'aide d'une feuille de style
    Par Daimonji dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 07/12/2006, 10h10
  4. [DOM]Créer dynamiquement du HTML à partir d'une chaîne
    Par jothi35 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 11/08/2006, 20h01

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