2009-01-12 6 views
0

Je construis un profileur de base pour un projet open source. Une exigence est de mesurer le temps d'exécution d'une méthode. Bien que cela soit assez facile, je dois le faire sans connaître la méthode ou sa classe contenant jusqu'à l'exécution. Le moyen d'invoquer le profileur sera lorsque l'utilisateur appellera le profileur de l'EDI dans un document actif. Donc, si class1 est ouvert et que l'utilisateur clique avec le bouton droit de la souris sur l'espace dans le document, sélectionne le profil, alors, et seulement alors, la classe est connue.Utilisation de génériques et de methodinfo

Je le code à utiliser MethodInfo:

MethodInfo methodInfo = typeof(t).GetMethod(s); 

T est juste un support de type générique (classe X où T: classe, est la signature de la classe). s est juste une chaîne du nom de la méthode.

J'ai cette erreur, cependant:

Nom du type prévu, mais le nom du paramètre trouvé.

La méthode conteneur de cette ligne de code a t comme paramètre de type T, mais le déplacer ne corrige pas le problème. T est juste un objet, et si je fournis un nom d'objet, comme le nom de la classe, il n'y a pas d'erreur.

Ce qui donne?

EDIT: Un activateur peut peut-être résoudre ce problème.

En outre, pourrais-je utiliser la clause where pour limiter T à une classe statique uniquement?

Merci

+0

Pouvez-vous montrer comment la méthode contenant cette ligne de code est appelée, s'il vous plaît? –

Répondre

1

Peut-être que vous avez besoin

t.GetType().GetMethod(s) 
2

L'erreur est due au fait que typeof attend un nom de type ou d'un paramètre comme typeof (int) ou typeof (T) où T est un paramètre de type. Il semble que t est une instance de System.Type, donc il n'y a pas besoin de typeof.

Avez-vous besoin d'un type générique pour cela? Est-ce que ça ne marchera pas?

public void DoSomething(object obj, string methodName) 
{ 
    MethodInfo method = obj.GetType().GetMethod(methodName); 
    // Do stuff 
} 

ou

public void DoSomething(Type t, string methodName) 
{ 
    MethodInfo method = t.GetMethod(methodName); 
    // Do stuff 
} 

En outre, il n'y a pas moyen de limiter un paramètre de type à une classe statique. Je ne suis pas sûr à quoi cela servirait car vous ne pouvez pas en avoir une instance et il ne sera pas capable d'implémenter les interfaces que vous pouvez utiliser dans une méthode générique.

0
public void DoSomething(object obj, string methodName) 
{ 
    MethodInfo method = obj.GetType().GetMethod(methodName); 
    // Do stuff 
} 

Cela a fait l'affaire (même chose que 2 messages ci-dessus).

Questions connexes