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

Framework .NET Discussion :

[IL]Instancier un objet à partir de son nom de classe


Sujet :

Framework .NET

  1. #1
    Expert éminent
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Points : 6 418
    Points
    6 418
    Par défaut [IL]Instancier un objet à partir de son nom de classe
    Bonjour,

    J'ai un problème un peu particulier

    Je cherche à instancier un objet en IL sachant que je n'ai que le nom de sa classe sous forme de string dans la pile.

    Quand je connais le type de mon objet je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ConstructorInfo TConstructor = typeof(T).GetConstructor(new Type[0]);
    ILout.Emit(OpCodes.Newobj, TConstructor);
    En déclarant :
    Le soucis que j'ai c'est que mon ConstructorInfo je peux pas le déclarer avant de générer l'IL parce que je "découvre" le nom de la classe à instancier dans mon IL.

    Je rentre pas dans les détails sur le choix de générer ce bout d'IL mais je fais pas ça pour le fun C'est juste qui si je passe par la réfléxion et la gènèration de c# les performances ne sont pas trés bonnes...


  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Août 2002
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 104
    Points : 128
    Points
    128
    Par défaut
    Bonjour,

    Je ne sais pas si ton problème est toujours d'actualité ... mais bon.

    Si tu accepte l'idée de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ConstructorInfo TConstructor = typeof(T).GetConstructor(new Type[0]);
    Tu devrais accepter la solution suivante :
    Si tu as le nom de la classe, tu peux obtenir l'objet Type correspondant et écrire quasiement la même chose que dans ton exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //On part du principe que l'assembly qui contient la classe à instancier est connue
    //Le nom de la classe est dans une variable : string typeName
    //On déclare également : ILGenerator ILout;
    Assembly asm = ...;
    Type type = asm.GetType(typeName);
    ConstructorInfo constructor = type .GetConstructor(new Type[0]);
    ILout.Emit(OpCodes.Newobj, constructor);

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    la raison du manque de performance de la reflexion c'est que les assemblies avec lesquelles tu travail ne sont pas obligatoirement en cache.

    Moi j'ai ce probleme avec du chargement dynamique de modules mais lors du premier démarrage. Une fois l'assembly en cache, la reflexion est très rapide.
    Maintenant si tu veux que ce soit TOUJOURS en cache et fortement améliorer les perfs de la reflexion tu peux référencer l'assembly dans le GAC.

Discussions similaires

  1. Instancier un objet page depuis son nom "maPage.aspx"
    Par tontonks dans le forum ASP.NET
    Réponses: 8
    Dernier message: 16/08/2010, 17h27
  2. Réponses: 3
    Dernier message: 14/04/2009, 18h09
  3. [VB.NET] Obtenir un objet à partir de son nom
    Par bart64 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 31/12/2006, 12h37
  4. Réponses: 3
    Dernier message: 12/07/2006, 16h33
  5. Réponses: 7
    Dernier message: 10/11/2005, 10h09

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