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 :

[2.0][Réflexion] Exécuter depuis une classe hérité, des méthodes des classes dérivées


Sujet :

Framework .NET

  1. #1
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut [2.0][Réflexion] Exécuter depuis une classe hérité, des méthodes des classes dérivées
    J'aimerais définir une méthode dans une classe abstraite, qui exécuterait des méthodes issues des classes dérivées.

    Par exemple, imaginons que j'ai une classe Niveau2 qui hérite d'une classe Niveau1 qui hérite elle même d'une classe Niveau0. Les classes Niveau1 et Niveau2 ont des méthodes qui renvoient un Booléen et possèdent toute un même attribut personnalisé.

    Comment écrire une méthode dans ma classe Niveau0 qui va exécuter chaque méthode possédant l'attribut personnalisé et enregistrer leur résultat ?

    Sachant que je connais ma classe Niveau0, mais pas les autres classes qui en dérivent.


    Je veux bien un exemple de code en VB.NET ou C#, ou simplement le nom des classes / méthodes du Framework que je dois utiliser.
    (\ _ /)
    (='.'=)
    (")-(")

  2. #2
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Points : 102
    Points
    102
    Par défaut
    Bonjour,

    En utilisant le namespace System.Reflection, tu peux obtenir l'ensemble des méthodes d'instances de ton objet. Pour chacune, il te faut vérifier la présence éventuelle de ton attribut, et invoquer la méthode.

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public void InvokeMethodWithMyCustomAttribute() {
    	MethodInfo[] mis = this.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public);
    	foreach(MethodInfo mi in mis)
    	{
    	if(mi.GetCustomAttributes(typeof(MyCustomAttribute)).Length > 0)
    		{
    			bool result = (bool)mi.Invoke(this, null);
    		}
    	}
    }

    J'ai mis Public puisque statiquement, une classe mère ne peut pas accéder au champs private et protected de ses enfants. Il lui faudrait passer par un cast statique (qui outre d'être pas beau), ne lui octroirait pas plus de droit qu'une autre classe.
    Néanmoins, la reflection permet moulte transgression, dont l'accéssibilité à des membres privées lorsque les droits lui permettent.

    cortex

  3. #3
    Membre expérimenté
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Points : 1 505
    Points
    1 505
    Par défaut
    Yess !

    Merci bien pour ton code qui répond parfaitement à ma question et m'introduit donc à System.Reflection.

    Pour les Vébéistes :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Private Sub InvokeMethodWithMyCustomAttribute()
            Dim mis() As Reflection.MethodInfo = Me.GetType().GetMethods(Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public)
            Dim mi As Reflection.MethodInfo
            For Each mi In mis
                If mi.GetCustomAttributes(GetType(MyCustomAttribute), False).Length > 0 Then
                    Dim result As Boolean = CType(mi.Invoke(Me, Nothing), Boolean)
                End If
            Next
        End Sub
    (\ _ /)
    (='.'=)
    (")-(")

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Points : 330
    Points
    330
    Par défaut
    Bonjour,
    Un vieux message mais une nouvelle question relative à la solution proposée pour les vébéistes.
    Je n'arrive pas à comprendre quoi mettre dans le premier paramètre de la méthode invoke (pour le second, pas de paramètres = nothing).
    La solution évoque l'utilisation de Me mais chez me, pardon, chez moi , ça ne le fait pas.
    Voici un bout de code pour mieux comprendre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    For Each TypeAssembly In MyAssembly.GetTypes()
      If TypeAssembly.name = "ClassToInvokeHelloWorld" Then
        For Each MyMethodInfo In TypeAssembly.GetMethods(BindingFlags.Public)
          If MyMethodInfo.name = "DisplayHelloWorld" Then
            MyMethodInfo = MyAssembly.GetType("cObfuscator").GetMethod("DisplayHelloWorld")
            MyObject = MyMethodInfo.Invoke(What ?, Nothing)
          End If
        Next
      End If
    Next
    Le soucis, c'est de trouver quoi mettre dans le What !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Points : 330
    Points
    330
    Par défaut
    OK, j'ai la réponse pour celles et ceux que ça interesse... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim MyObject as new Object
    myobject = Activator.CreateInstance(MyAssembly.GetType("ClassToInvokeHelloWorld"))
    MyMethodInfo.Invoke(MyObject, Nothing)
    Et miracle... un msgbox HelloWorld défini dans la méthode s'affiche !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/04/2013, 09h31
  2. Réponses: 1
    Dernier message: 08/04/2011, 12h22
  3. Lancer un .bat avec exécution depuis une IHM
    Par tanguy.L dans le forum Langage
    Réponses: 13
    Dernier message: 14/06/2009, 18h21
  4. Utilisation des méthodes de classe dans une autre classe
    Par ChriGoLioNaDor dans le forum C++
    Réponses: 4
    Dernier message: 28/07/2007, 15h10
  5. Réponses: 3
    Dernier message: 08/05/2007, 17h32

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