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 :

Pouvoir appeler le getter d'une property par un String


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut Pouvoir appeler le getter d'une property par un String
    Bonjour à tous,

    J'essaie de créer un contrôle qui s'assimile un peu au fonctionnement d'un combobox. Pour cela, j'ai deux propriétés : un ItemsSource (IEnumerable(of Object) et un DisplayMember (String).

    Je souhaiterai pouvoir réaliser une requete linq sur ma source pour regarder si je trouve un élément dont la propriété ayant pour nom la valeur de DisplayMember commence par un texte saisi.

    Je dois avouer que là je suis dans un flou total je ne vois pas vraiment comment taper dans une propriété dont je ne connais pas à l'avance le nom, ni le type de l'objet la portant.

    Auriez vous une idée svp ?
    Merci d'avance

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    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 198
    Par défaut
    par reflection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for each element in collection
       if element.gettype.getproperty("nom de la propriété",public or instance) IsNot Nothing then
           'y a au moins un élément qui a un propriété de ce nom qui est public
           exit for
       end if
    next
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    En effet... je n'y avais pas pensé...
    Par contre, tant qu'à faire dans le pédagogique, t'aurais pas la même mais en lambda expression ? j'ai pu voir que les perfs etaient 10 fois meilleures que la reflexion.

    En fait, ce qui me gonfle, c'est que je n'ai aucune compétence en lambda expression et que j'ai vachement de mal à trouver des tutos sympas pour aborder le sujet sans etre effrayé dès le départ.

    En tout cas merci bien ! en attendant de trouver plus performant, je vais utiliser ca

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    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 198
    Par défaut
    j'ai cru comprendre que ce qu'on appelle couramment expression lambda en vb.net ce n'est rien d'autre qu'une fonction anonyme
    et apparemment il y aurait aussi des vrais expressions lambda sur lesquelles je n'ai pas encore eut l'occasion de me pencher

    les fonctions anonymes n'apporte à mon avis pas de perfs par rapport à une fonction "en dur"
    quand à linq, dans certains cas il ne va pas plus vite qu'un for each bien écrit non plus (certes sur ienumerable avec des enchainements costaud ca peut l'être)

    l'équivalent linq de ce que j'ai écris doit être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim contains as boolean = (from e in collection where  e.gettype.getproperty("nom de la propriété",public or instance) IsNot  Nothing select e).FirstOrDefault IsNot Nothing
    et là à priori, linq va faire le tour et quand il trouve un qui a la propriété il sort de la boucle, donc ca gagne des lignes de code et ca amène parfois plus de lisibilité avec le phrasé de ce qu'on veut faire plutot qu'une succession d'instructions non documentées


    si tu veux gagner des perfs tu peux aussi regarder si tu ne pourrais pas implémenter une interface contenant ta propriété !
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Yep, c'est ce que je pensais faire mais y'a toujours ce probleme de perfs.
    En fait, je me demande si je ne confond pas un peu tout :
    Tu as d'une part Linq, ensuite tu as les lambda expressions (fonctions anonymes en effet) et enfin tu as les arbres d'expressions. Pour moi les deux derniers vont ensemble mais je me demande si je ne comprend pas ca à tort.
    Pour ce qui est des perfs, voici un article comparant les différentes méthodes (cf en bas de l'article il y'a un tableau avec les temps d'accès). Tu verras que la reflection est bien loin derriere le reste...

    http://geekswithblogs.net/Madman/arc...ion-trees.aspx

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    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 198
    Par défaut
    déjà j'avais mal lu ton problème d'origine
    le code que je t'ai mis c'était juste pour voir si un objet avait une propriété du nom donné, pas la lire
    getproperty.getvalue de la reflection c'est clair que ca doit etre la plus lente des possibilités

    bref je viens de faire le test sur une collection d'un million d'instance et un filtre pour avoir ceux dont la propriété qu'on connait as string startswith("quelquechose")

    avec une boucle, du linq, de la reflection ou une fonction anonyme qui fait de la reflection le résultat est le même
    avec une reflection améliorée (un getgetmethod plutot qu'un getvalue à chaque fois) on gagne 20%
    et ce qui devrait être mieux mais que je ne peux pas tester car je ne connais pas c'est les expressions comme dans ton lien

    il faudrait voir les classes collectionview et autre qui sont apparues avec wpf, elles sont peut etre utilisable en windows forms et permettent de faire des filtres sur des noms de propriété
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. plugin perso, appel une méthode par un string
    Par splifferwolf dans le forum jQuery
    Réponses: 3
    Dernier message: 27/11/2011, 13h17
  2. WCF Data Service : remplir une liste par des String
    Par safisafi dans le forum Silverlight
    Réponses: 7
    Dernier message: 22/07/2011, 18h58
  3. [XL-2007] appeler le, contenu d'une cellule par celui d'une autre lui correspondant
    Par manuseverine dans le forum Excel
    Réponses: 15
    Dernier message: 16/08/2010, 14h35
  4. Tuto MVVM : dans le source, une property de type string retourne un booléen ?!
    Par zax-tfh dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 23/03/2009, 08h35
  5. [Property] Comment déclarer une chaine par defaut ?
    Par Clorish dans le forum Composants VCL
    Réponses: 8
    Dernier message: 07/09/2004, 22h11

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