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

VB.NET Discussion :

Reflexion et Cast dynamique


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Gurdil le nain
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 468
    Par défaut Reflexion et Cast dynamique
    Bonjour à tous,

    Je me retrouve confronté à un problème.
    J'utilise pas mal de réflexion en ce moment pour créer des objets et les remplir.
    je récupère toutes les valeurs à remplir dans un XML, donc en String et je n'ai aucune envie de caster à la lecture.

    Le problème est qu'au remplissage des propriétés des objets qui ne sont pas des strings, ça pète...normal jusque là.

    J'aimerais donc caster les string à la volée juste avant de les mettre dans les champs.
    Je fais donc çà pour récupérer le type de la propriété :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    'Récupération du type de l'objet à créer
    Dim objType As Type = dbAssembly.GetType(nmSpace & table)
     
    'Création de l'objet voulu
    Dim instance As Object = Activator.CreateInstance(objType)
     
    'Récupération de la propriété
    Dim objField As PropertyInfo = objType.GetMember(field)(0)
    Une fois ça de fait (ça fonctionne niquel, mais si vous avez mieux, je prends ), j'aimerais faire un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CallByName(instance, field, [Set], CType(value, objField.PropertyType))
    Seulement ce couillon de compilateur aime pas, parce qu'il voudrait un type prédéfinie...une solution ?
    Thanx
    Gurdil

  2. #2
    Membre émérite
    Avatar de Gurdil le nain
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 468
    Par défaut
    Bon alors en fait, c'est moi qui lui passait nawak au ptit

    Il n'empêche que j'ai fait quelques recherches infructueuses au sujet du cast dynamique, et qu'une réponse constructive sur le sujet m'intéresserais...

    Merci

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    si tu es sur le framework 4, il y a les expressions lambdas
    c'est affreux à écrire mais ca permet de faire n'importe quoi en dynamique (et ca peut se compiler pour ne pas bouffer trop de temps comme la reflection)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    si tu es sur le framework 4, il y a les expressions lambdas
    c'est affreux à écrire mais ca permet de faire n'importe quoi en dynamique (et ca peut se compiler pour ne pas bouffer trop de temps comme la reflection)
    Le truc dont tu parles c'est plutôt les expression trees... (System.Linq.Expressions.Expression). C'est dispo en 3.5 aussi, mais c'est plus limité.

    Par contre compiler une expression n'est pas plus rapide que d'utiliser la réflexion... c'est juste qu'une fois que c'est compilé, tu as un delegate que tu peux réutiliser à chaque fois.

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Le truc dont tu parles c'est plutôt les expression trees... (System.Linq.Expressions.Expression). C'est dispo en 3.5 aussi, mais c'est plus limité.

    Par contre compiler une expression n'est pas plus rapide que d'utiliser la réflexion... c'est juste qu'une fois que c'est compilé, tu as un delegate que tu peux réutiliser à chaque fois.

    merci de me donner le nom exact, je pensais que c'était lambda car c'est ce qu'on voit un peu partout, mais quand on dit lambda les gens pensent aux fonctions anonymes

    sinon j'ai fait des tests, et dans mon cas c'était beaucoup plus rapide que la reflection ... enfin y avait une boucle dans l'histoire et j'ai intégré la boucle dans le tree, en opposition à la reflection à chaque tour ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    merci de me donner le nom exact, je pensais que c'était lambda car c'est ce qu'on voit un peu partout, mais quand on dit lambda les gens pensent aux fonctions anonymes
    En fait, "lambda expression" fait référence à la nouvelle syntaxe utilisée pour les méthodes anonymes. Une lambda expression peut être convertie en delegate ou en expression tree, selon le contexte

    Citation Envoyé par Pol63 Voir le message
    enfin y avait une boucle dans l'histoire et j'ai intégré la boucle dans le tree, en opposition à la reflection à chaque tour ...
    A priori c'est pour ça

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Gurdil le nain Voir le message
    Il n'empêche que j'ai fait quelques recherches infructueuses au sujet du cast dynamique, et qu'une réponse constructive sur le sujet m'intéresserais...
    C'est une question récurrente, qui n'a pas de solution... tout simplement parce que ça n'a pas de sens !

    Un cast sert simplement à changer le type statique d'une variable, pour pouvoir accéder à ses membres. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    object o = new Foo();
    o.SayHello(); // ne fonctionne pas...
    Foo f = (Foo)o;
    f.SayHello(); // OK
    Comme tu sais que o fait référence à un objet de type Foo, tu cast en Foo pour pouvoir accéder à la méthode SayHello, mais ça reste une référence sur le même objet. C'est juste le compilateur qui a besoin de savoir qu'il s'agit d'un Foo et pas d'autre chose.

    Maintenant, dans le cas "dynamique", l'objet peut être de n'importe quel type, donc tu ne vas pas essayer d'accéder à un membre spécifique... et donc ça ne sert à rien de caster.

  8. #8
    Membre émérite
    Avatar de Gurdil le nain
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 468
    Par défaut
    Citation Envoyé par tomlev Voir le message
    C'est une question récurrente, qui n'a pas de solution... tout simplement parce que ça n'a pas de sens !

    Un cast sert simplement à changer le type statique d'une variable, pour pouvoir accéder à ses membres. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    object o = new Foo();
    o.SayHello(); // ne fonctionne pas...
    Foo f = (Foo)o;
    f.SayHello(); // OK
    Comme tu sais que o fait référence à un objet de type Foo, tu cast en Foo pour pouvoir accéder à la méthode SayHello, mais ça reste une référence sur le même objet. C'est juste le compilateur qui a besoin de savoir qu'il s'agit d'un Foo et pas d'autre chose.

    Maintenant, dans le cas "dynamique", l'objet peut être de n'importe quel type, donc tu ne vas pas essayer d'accéder à un membre spécifique... et donc ça ne sert à rien de caster.
    Ouais, pas faux.
    Mais je pensais au début (avant de me rendre compte que c'est moi qui faisais de la merde; j'adooore la fin de journée), que le CallByName ne castait pas tout seul...d'où une utilité du cast dynamique.

    Mais merci en tout cas.

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

Discussions similaires

  1. [Reflexion?] Casting dynamique
    Par diaboloche dans le forum Windows Forms
    Réponses: 2
    Dernier message: 03/11/2008, 13h57
  2. Casting Dynamique et l'inserer dans jComboBox ?
    Par ExSter dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 13/06/2007, 03h26
  3. Polymorphisme et cast dynamique
    Par vcoulon dans le forum C++
    Réponses: 16
    Dernier message: 21/03/2007, 14h03
  4. Cast dynamique d'un objet ?
    Par elitost dans le forum Langage
    Réponses: 2
    Dernier message: 02/05/2006, 10h43
  5. [DP][héritage]sous-casting dynamique
    Par Le prophete dans le forum Général Java
    Réponses: 4
    Dernier message: 20/08/2004, 11h56

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