Méthode Invoke par MethodInfo

Je veux invoquer des méthodes avec un certain atsortingbut. Je passe donc en revue tous les assemblages et toutes les méthodes pour trouver les méthodes avec mon atsortingbut. Fonctionne bien, mais comment invoquer une certaine méthode quand je n’ai que sa méthode 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 connais pas l’instance de la classe qui contient cette méthode. Je ne peux donc pas l’invoquer correctement car les méthodes ne sont pas statiques. Je souhaite également éviter de créer une nouvelle instance de cette classe si possible.

Cela me semble être un problème en termes de définition du problème plutôt que de codage.

Les méthodes d’instance dépendent de l’instance sur laquelle elles sont appelées. Cela n’a aucun sens d’appeler une méthode d’instance sans se soucier de ce à quoi elle est appelée. (Comme le dit Martin, une méthode d’instance ne tenant pas compte de l’instance sur laquelle elle est appelée doit presque toujours être statique. La seule exception immédiate à laquelle je puisse penser est les méthodes virtuelles, où l’instance spécifie implicitement quelle implémentation utiliser.)

Déterminez ce que cela signifie vraiment dans votre contexte pour qu’il y ait une méthode d’instance annotée. Pourquoi essayez-vous d’invoquer des méthodes de toute façon? Quelle est la plus grande image? Quel contexte as-tu? Je suspecte fortement que vous souhaitiez une certaine notion de contexte – une collection d’objects sur lesquels vous pouvez appeler les méthodes d’instance.

Les méthodes non statiques étant spécifiques à une instance, vous devez instancier la classe pour appeler la méthode. Si vous avez la possibilité de changer le code là où il est défini et que la méthode ne nécessite pas elle-même de faire partie d’une instance (elle n’a pas access aux propriétés ni aux méthodes non statiques de la classe), la meilleure pratique serait alors: soit de rendre la méthode statique de toute façon.

En supposant que vous ne puissiez pas le rendre statique, 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 objects existants, puis d’effectuer une recherche dans la liste. Ainsi, lorsque vous créez ces objects invocables, vous les stockez dans la liste (ou peut-être que la liste doit être une liste d’objects d’une autre sorte, comportant également une description de l’object invocable). Ensuite, vous pouvez parsingr la liste au moment de l’exécution, trouver celui qui correspond au type d’événement que vous gérez, puis rechercher sa methodInfo et appeler .Invoke sur les informations de la méthode, en supposant que vous voulez faire. Vous devrez également transmettre les arguments appropriés, mais vous pouvez le faire en créant un vecteur d’objects du type approprié.