none
reflexion c# RRS feed

  • Question

  • bonjour à tout le monde

    je voudrais savoir comment je peux trouver un membre d'une classe qui se trouve dans un assembly. je m'explique :

    dans un assembly que le nomme "Assem" qui correspond à un namespace, je dispose d'un ensemble de namespace et de classe.
    mon objectif est de trouver une méthode qui correspond à un nom (unique) et se trouve dans l'une des classes sous-jacentes de Assem

    finalement c'est comment récupérer tout les classes de l'assembly Assem et parcourir les memebres de ces classes afin de retrouver le memebre que je cherche

    N.B. ca serait bien que microsoft  pense (si ca n'existe pas encore) à indexer les classes et assembly pour pouvoir retrouver facilement des membres des classe sans faire des recherche sequentielle bete et méchantes dans les assembly du AppDomain.CurrentDomain.GetAssemblies()
    PhD - Student
    vendredi 23 octobre 2009 13:53

Réponses

  • Si ton assembly n'est pas chargée tu peux utiliser Assembly.load

    Si tu veux créer une instance d'une classe Activator.CreateInstance

    Pour simplement exécuter une méthode il te faut récupérer un objet MethodInfo depuis le type de ta classe et appeler la méthode Invoke
    • Marqué comme réponse OmarioS vendredi 23 octobre 2009 16:44
    vendredi 23 octobre 2009 14:23
    Modérateur
  • j'ai procédé comme suit

            public static MethodInfo getMethode(Assembly assembly, String methodName)
            {
                foreach (Type t in assembly.GetTypes())
                {
                    foreach (MethodInfo mInfo in t.GetMethods())
                    {
                        if (mInfo.Name.ToLower().Equals(methodName.ToLower()))
                        {
                            return mInfo;
                        }
                    }
                }
                return null;
            }

    mais bon ca serait mieux que ce soit en accès directe genre  assembly[indexClasse][indexmembre]...


    PhD - Student
    • Marqué comme réponse OmarioS vendredi 23 octobre 2009 16:44
    vendredi 23 octobre 2009 16:44
  • Bonjour,
    mais bon ca serait mieux que ce soit en accès directe genre  assembly[indexClasse][indexmembre]...


    avec des indexes numériques, ça n'aurait pas de sens... et j'avoue que je suis un peu perplexe sur le besoin de chercher une méthode par son nom sans se préoccuper de la classe (ce que fait la boucle donnée en exemple).
    On a des accès directs quand même :

    // Récupérer le Type à partir de son nom :
    Type Assembly.GetType(string name)
    // Récupérer le MethodInfo à partir de son nom :
    MethodInfo GetMethod(string name)


    Bonne journée

    samedi 24 octobre 2009 05:04
  • en faite pour la boucle c'est un choix d'organisation:
    en faite j'ai défini beaucoup (25 pour l'instant , mais ca va augmenter) de UDT dans SQL SERVER 2008
    et pour chaque UDT, j'ai défini des UDA et UDF qui s'appliquent sur ce UDT.
    du coup je me retrouve avec plein de UDF et UDA. donc j'ai décidé de regrouper les UDF appliqué sur un meme UDT dans une méme classe. meme si ca n'a aucune utilité technique, cela me permet d'organiser mon code pour une meilleur lisibilité.

    avec la méthode MethodInfo GetMethod(string name) c'est mieu

    public static MethodInfo getMethode(Assembly assembly, String methodName)
            {
                MethodInfo m;
                foreach (Type t in assembly.GetTypes())
                {
                    m = t.GetMethod(methodName);
                    if (m != null) return m;
                }
                return null;
            }

    PhD - Student
    • Marqué comme réponse OmarioS lundi 26 octobre 2009 11:02
    lundi 26 octobre 2009 11:01

Toutes les réponses

  • Si ton assembly n'est pas chargée tu peux utiliser Assembly.load

    Si tu veux créer une instance d'une classe Activator.CreateInstance

    Pour simplement exécuter une méthode il te faut récupérer un objet MethodInfo depuis le type de ta classe et appeler la méthode Invoke
    • Marqué comme réponse OmarioS vendredi 23 octobre 2009 16:44
    vendredi 23 octobre 2009 14:23
    Modérateur
  • j'ai procédé comme suit

            public static MethodInfo getMethode(Assembly assembly, String methodName)
            {
                foreach (Type t in assembly.GetTypes())
                {
                    foreach (MethodInfo mInfo in t.GetMethods())
                    {
                        if (mInfo.Name.ToLower().Equals(methodName.ToLower()))
                        {
                            return mInfo;
                        }
                    }
                }
                return null;
            }

    mais bon ca serait mieux que ce soit en accès directe genre  assembly[indexClasse][indexmembre]...


    PhD - Student
    • Marqué comme réponse OmarioS vendredi 23 octobre 2009 16:44
    vendredi 23 octobre 2009 16:44
  • Bonjour,
    mais bon ca serait mieux que ce soit en accès directe genre  assembly[indexClasse][indexmembre]...


    avec des indexes numériques, ça n'aurait pas de sens... et j'avoue que je suis un peu perplexe sur le besoin de chercher une méthode par son nom sans se préoccuper de la classe (ce que fait la boucle donnée en exemple).
    On a des accès directs quand même :

    // Récupérer le Type à partir de son nom :
    Type Assembly.GetType(string name)
    // Récupérer le MethodInfo à partir de son nom :
    MethodInfo GetMethod(string name)


    Bonne journée

    samedi 24 octobre 2009 05:04
  • en faite pour la boucle c'est un choix d'organisation:
    en faite j'ai défini beaucoup (25 pour l'instant , mais ca va augmenter) de UDT dans SQL SERVER 2008
    et pour chaque UDT, j'ai défini des UDA et UDF qui s'appliquent sur ce UDT.
    du coup je me retrouve avec plein de UDF et UDA. donc j'ai décidé de regrouper les UDF appliqué sur un meme UDT dans une méme classe. meme si ca n'a aucune utilité technique, cela me permet d'organiser mon code pour une meilleur lisibilité.

    avec la méthode MethodInfo GetMethod(string name) c'est mieu

    public static MethodInfo getMethode(Assembly assembly, String methodName)
            {
                MethodInfo m;
                foreach (Type t in assembly.GetTypes())
                {
                    m = t.GetMethod(methodName);
                    if (m != null) return m;
                }
                return null;
            }

    PhD - Student
    • Marqué comme réponse OmarioS lundi 26 octobre 2009 11:02
    lundi 26 octobre 2009 11:01