Question

Je veux appeler des méthodes avec un certain attribut. Donc, je suis à vélo à travers tous les ensembles et toutes les méthodes pour trouver les méthodes avec mon attribut. Fonctionne très bien, mais comment puis-je appeler une certaine méthode quand je ne l'ai est MethodInfo.

AppDomain app = AppDomain.CurrentDomain;
Assembly[] ass = app.GetAssemblies();
Type[] types;
foreach (Assembly a in ass)
{
    types = a.GetTypes();
    foreach (Type t in types)
    {
        MethodInfo[] methods = t.GetMethods();
        foreach (MethodInfo method in methods)
        {
            // Invoke a certain method
        }
    }
}

Le problème est que je ne sais pas l'instance de la classe qui contient cette certaine méthode. Donc, je ne peux pas correctement parce que l'invoquons les méthodes ne sont pas statiques. Je veux aussi éviter de créer une nouvelle instance de cette classe si possible.

Était-ce utile?

La solution

Cela me semble un problème en termes de la définition du problème plutôt que de coder.

Les méthodes d'instance dépendent de l'instance qu'ils ont appelé - il n'a pas de sens d'appeler une méthode d'instance sans se soucier de ce qu'il a appelé. (Comme Martin dit, une méthode d'instance qui ne se soucie pas quelle instance il est appelé à doit presque toujours être statique. La seule exception immédiate que je peux penser à cela est des méthodes virtuelles, où l'instance précise implicitement que la mise en œuvre à utiliser.)

Travaillez ce vraiment signifie dans votre contexte pour qu'il y ait une méthode d'instance annotée. Pourquoi essayez-vous d'invoquer les méthodes de toute façon? Quelle est la plus grande image? Quel contexte avez-vous? Je soupçonne fortement vous voulez une idée d'un contexte -. Une collection d'objets que vous peut appeler les méthodes d'instance sur

Autres conseils

Les méthodes non statiques sont spécifiques par exemple si vous devez instancier la classe pour appeler la méthode. Si vous avez la possibilité de modifier le code où il est défini et la méthode ne nécessite pas lui-même de faire partie d'une instance (il n'a pas accès ou modifier les propriétés non-statiques ou des méthodes à l'intérieur de la classe), alors les meilleures pratiques serait être de rendre la méthode statique de toute façon.

En supposant que vous ne pouvez pas le rendre statique alors le code dont vous avez besoin est le suivant:

    foreach (Type t in types)
    {
            object instance = Activator.CreateInstance(t);

            MethodInfo[] methods = t.GetMethods();
            foreach (MethodInfo method in methods)
            {                    
                method.Invoke(instance, params...);    
            }
    }

En fait, je pense que ce que vous devez faire est de créer une liste des objets existants et la recherche puis la liste. Alors que vous créez ces objets invocables, vous les stocker dans la liste (ou peut-être la liste doit être une liste d'objets d'un autre type qui a également une description de l'objet appelable). Ensuite, vous pouvez parcourir la liste lors de l'exécution, trouver celui qui correspond au type d'événement que vous gérez, et ensuite chercher son METHODINFO et appelez .invoke sur les informations de méthode, en supposant est ce que vous voulez faire. Vous devrez également passer les arguments appropriés, mais vous pouvez le faire en créant un vecteur d'objets des bons types.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top