Appeler la méthode par MethodInfo
Je veux appeler des méthodes avec un certain attribut.
Donc, je suis à vélo à travers toutes les assemblées et toutes les méthodes pour trouver les méthodes avec mon attribut. Fonctionne très bien, mais comment puis-je invoquer une certaine méthode lorsque j'ai seulement c'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 la méthode donnée. Donc je ne peux pas l'appeler correctement, car les méthodes ne sont pas statiques.
Je tiens également à éviter de créer une nouvelle instance de cette classe si possible.
OriginalL'auteur apparat | 2009-05-28
Vous devez vous connecter pour publier un commentaire.
Ce qui me frappe comme un problème au niveau de la définition du problème plutôt que de coder.
Méthodes d'Instance, qui dépendent de l'instance qu'ils sont appelé - il aucun sens de l'appeler une méthode d'une instance sans se soucier de ce qu'il a appelé. (Martin dit, une méthode d'instance qui ne se soucie pas de qui exemple, il est appelé devrait presque toujours être statique. La seule exception immédiate je pense, pour ce qui est des méthodes virtuelles, où l'instance implicitement spécifie la mise en œuvre de l'utiliser.)
Travailler sur ce qu'il a vraiment signifie dans votre contexte, pour qu'il y ait annoté de la méthode d'instance. Pourquoi essayez-vous d'appeler des méthodes de toute façon? Quelle est l'image plus grande? Quel contexte avez-vous? Je soupçonne fortement que vous aurez envie certaine notion de contexte - une collection d'objets qui vous peut appeler les méthodes d'instance.
OriginalL'auteur Jon Skeet
Non-statique méthodes d'instance, de sorte que 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 d'être elle-même partie d'une instance (il n'a pas d'accès ou de rectification aux non-statique des propriétés ou des méthodes à l'intérieur de la classe), alors la meilleure pratique serait de faire de la méthode statique de toute façon.
En supposant que vous ne pouvez pas vous rendre statique puis le code que vous avez besoin est comme suit:
Oups. Édité grâce.
OriginalL'auteur Martin Harris
En fait, je pense que ce que vous devez faire est de créer une liste des objets existants, puis rechercher dans la liste. De sorte que vous pouvez créer ces invokable objets, vous les stocker dans la liste (ou peut-être la liste doit être une liste d'objets d'un autre type qui a aussi une description de la invokable objet). Ensuite, vous pouvez parcourir la liste au moment de l'exécution, de trouver celle qui correspond au type d'événement que vous manipulez, et ensuite chercher son methodInfo et d'appel .Invoquer la méthode info, en supposant que c'est ce que vous voulez faire. Vous aussi, vous avez besoin de passer des arguments appropriés, mais vous pouvez le faire en créant un vecteur d'objets du droit des types.
OriginalL'auteur Ken Birman