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 :

Problème pour trouver une méthode avec "reflection.getType().GetMethod()"


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Par défaut Problème pour trouver une méthode avec "reflection.getType().GetMethod()"
    Bonsoir à tous,

    Après avoir galéré de nombreuses heures sur le sujet, je vous transmet mon analyse en espérant que quelqu'un puisse avoir la solution.

    J'ai réalisé une application de gestion, qui a de nombreux écrans de gestion de données et j'ai donc centralisé dans une classe "outils", toutes les fonctions de base qui permettent de limiter dans chaque "form", le code redondant.
    Ainsi, toute la gestion des "edit","commit" et rollback est centralisée dans la classe des "outils". La clef étant le DataGridView, qui connait le "BindingSource", lui même connait le "DataSet" et le "DataTable" concerné. Il manquait évidemment le "TableAdapter", qu'il est difficile de relier aux autres composants. Pour l'instant, j'ai passé le "TableAdapter" en paramétre et est récupéré en tant qu'objet dans la procédure "outil" concernée.
    Tourtefois, et contrairement à VB, un objet ne peut pas appeler les méthodes (Update et Fill) du "TableAdapter". Il m'a été nécessaire de passer par "Reflection" et après de nombreuses tentatives, j'ai trouvé un moyen de récupérer la méthode et de l'utiliser avec "Invoke", mais c'est bancale.
    En effet, il y a une méthode "GetType().GetMethod", qui malgré toutes mes tentatives (string avec "Update", string avec "Update (namespace.Dataset") ne me redonne que null. Je précise que la méthode à retrouver est publique et que j'ai utilisé tous les paramètres qui me semblaient utiles : "MethodInfo My_MethodeInfo = My_Adapter.GetType().GetMethod("Update", BindingFlags.Public | BindingFlags.Instance, null, CallingConventions.Any, new Type[] { typeof(DataSet) }, null); "

    Pourtant la méthode existe, car en utilisant "GetType().GetMethods()", je trouve la méthode avec la collection (voir ci-dessous) :
    [0]: {Boolean get_ClearBeforeFill()}
    [1]: {Void set_ClearBeforeFill(Boolean)}
    [2]: {Int32 Fill(BiensDataTable)}
    [3]: {BiensDataTable GetData()}
    [4]: {Int32 Update(BiensDataTable)}
    [5]: {Int32 Update(MY_HOME.MH_DataSet)}
    [6]: {Int32 Update(System.Data.DataRow)}

    La méthode qui m'intéresse est la méthode indice [5] et en la passant à un objet "MethodInfo", je peux réaliser mon opération d'update.
    Dans mon programme je l'utilise de la manière suivante : My_Method = My_TA.GetType().GetMethods()[5].
    La procédure fonctionne, mais je trouverai propre de retrouver la méthode indice [5] par une recherche via le nom ("Update").
    Comme vous pouvez le constater j'ai creusé le sujet, mais je n'arrive pas à finaliser.
    Si vous avez la solution, qui doit certainement être devant mon nez, je vous en serait reconnaissant.
    Cordialement

    Pierre

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 507
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 507
    Par défaut
    Dans ta fonction recherchée, le type n'est pas un DataSet mais un MY_HOME.MH_DataSet d'après le résultat que tu montre, donc un .GetMethod("Update",new Type[]{typeof(MY_HOME.MH_DataSet)}) devrait donner la bonne méthode.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Par défaut
    Citation Envoyé par umfred Voir le message
    Dans ta fonction recherchée, le type n'est pas un DataSet mais un MY_HOME.MH_DataSet d'après le résultat que tu montre, donc un .GetMethod("Update",new Type[]{typeof(MY_HOME.MH_DataSet)}) devrait donner la bonne méthode.
    Bonjour Umfred, merci pour l'info et c'était bien devant mon nez. La fonction marche parfaitement.

    A ma décharge, la fonction GetMethod, n'est pas très claire, car c'est bien le DataSet que l'on met en paramètre dans l'update.
    Merci encore.

    Pierre

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Par défaut Effet de bord
    je reprend le sujet, car j'ai constaté un effet de bord sur l'utilisation de GetType().GetMethods().
    En effet, je me suis rendu compte que lors de l'utilisation de la méthode "Fill" (par GetType().GetMethods()) suite à un "Addnew" et un "Update", la fonction "Fill" perturbe l'affichage et le contenu du Datagridview.
    Ce problème n'apparaît pas lors de l'utilisation de la méthode "Fill" (par GetType().GetMethods()) lors d'un "Update" seul ou d'un "Delete".
    De plus, lorsque je fais un "Fill" (par la fonction normale, en dur), suite à l'utilisation de la fonction "Fill" (par GetType().GetMethods()) l'affichage et le contenu du Datagridview est rétabli.
    Plutôt qu'un long discours, je t'ai fait des screenshots des différentes étapes :
    - fichier "Fonction_fill_apres_addnew_update.png" : correspond à la fonction que j'applique
    - fichier " Fonction_fill_normal_apres_fill_methode.png" : correspond à la méthode normale utilisée
    - fichier "Liste_methodes.png" : correspond à la liste des méthodes disponibles avec GetType().GetMethods()
    - fichier "Methode_fill_recuperee.png" : correspond au détail de la fonction "Fill" récupérée par ma fonction de recherche, via GetType().GetMethods()
    les fichiers test_1... à test_3... donnent une indication de ce que l'on obtient à l'écran avec ou sans la fonction normale "fill", appliquée après la fonction "fill" utilisée via la recherche de méthode GetType().GetMethods().
    L'enregistrement initial est biffé en rouge pour protection et on peut constater que lors d'une anomalie, les valeurs peuvent disparaître et les numériques sont remis à 0. Situation très étrange que je n'ai jamais constaté sur les Datagridview.

    J'espère avoir été assez clair et précis pour que cela puisse aider à comprendre ce bug.
    Merci pour votre aide.
    Cordialement
    PierreNom : Fonction_fill_apres_addnew_update.png
Affichages : 39
Taille : 38,7 KoNom : Fonction_fill_normal_apres_fill_methode.png
Affichages : 42
Taille : 26,2 KoNom : Liste_methodes.png
Affichages : 40
Taille : 44,4 KoNom : Methode_fill_recuperee.png
Affichages : 38
Taille : 40,2 KoNom : Test_1_Initial.png
Affichages : 39
Taille : 12,6 KoNom : test_1_Initial_avant_validation.png
Affichages : 38
Taille : 13,8 KoNom : test_1_screen_apres_fill_methode.png
Affichages : 39
Taille : 13,7 KoNom : Test_2_Initial.png
Affichages : 41
Taille : 14,0 KoNom : test_2_screen_apres_fill_methode_et_fill_normal.png
Affichages : 40
Taille : 15,0 KoNom : test_3_screen_apres_fill_methode.png
Affichages : 39
Taille : 15,1 Ko

Discussions similaires

  1. Problème pour trouver une HEURE avec FIND.
    Par chachaboy dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 11/01/2021, 22h10
  2. Réponses: 20
    Dernier message: 30/07/2019, 11h47
  3. Algo le plus rapide pour trouver une répétition ?
    Par AsmCode dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 28/07/2005, 00h26
  4. Réponses: 5
    Dernier message: 26/05/2005, 15h40
  5. Conseils pour developper une application avec Oracle
    Par belugha dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 02/06/2003, 16h03

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