2008-10-18 4 views
2

J'essaie ceci:Comment obtenir un MethodInfo dans la classe ThreadContext?

Type ThreadContextType = typeof(Application).GetNestedType("ThreadContext", System.Reflection.BindingFlags.NonPublic); 
MethodInfo FDoIdleMi = ThreadContextType.GetMethod("FDoIdle", BindingFlags.NonPublic | 
    BindingFlags.Instance, null, new Type[] { typeof(Int32) }, null); 

ThreadContextType est ok mais FDoIdleMi est nulle. Je sais qu'il y a un problème dans l'appel GetMethod car FDoIdle provient de l'interface UnsafeNativeMethods.IMsoComponent.

Comment faire? Merci.

Répondre

2

Vous devez entièrement qualifier le nom de la méthode, parce qu'ils utilisent l'implémentation d'interface explicite:

Type type = typeof(Application).GetNestedType("ThreadContext", 
    BindingFlags.NonPublic); 
MethodInfo doIdle = type.GetMethod(
    "System.Windows.Forms.UnsafeNativeMethods.IMsoComponent.FDoIdle", 
    BindingFlags.NonPublic | BindingFlags.Instance); 

Pour mémoire, ce qui reflète les membres non publiques est pratique généralement mauvaise, mais vous savez probablement déjà cette.

EDIT Dans l'esprit de l'enseignement d'une personne à pêcher, je compris cela en appelant GetMethods(...) sur l'objet de type, et en examinant le tableau retourné pour voir comment les méthodes ont été nommés. Effectivement, les noms incluaient la spécification complète de l'espace de nommage.

+0

J'ai essayé avec UnsafeNativeMethods.IMsoComponent.FDoIdle mais j'ai oublié le préfixe System.Windows.Forms. Merci pour ça. –

1

Il est hacky, mais cela fonctionne:

using System; 
using System.Linq; 
using System.Reflection; 
using System.Windows.Forms; 

public class Test 
{ 
    static void Main() 
    { 
     Type clazz = typeof(Application).GetNestedType("ThreadContext", BindingFlags.NonPublic); 
     Type iface = typeof(Form).Assembly.GetType("System.Windows.Forms.UnsafeNativeMethods+IMsoComponent"); 
     InterfaceMapping map = clazz.GetInterfaceMap(iface); 
     MethodInfo method = map.TargetMethods.Where(m => m.Name.EndsWith(".FDoIdle")).Single(); 
     Console.WriteLine(method.Name); 
    } 
} 

Il existe des moyens plus infaillibles de correspondant à la méthode cible, mais cela arrive à travailler cette fois :)

+0

Peut-être moins évident que ce que Charlie a écrit, mais très intéressant. –

Questions connexes