2008-10-18 52 views
2

我想这一点:如何在ThreadContext类中获取MethodInfo?

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是好,但FDoIdleMi为空。我知道GetMethod调用有问题,因为FDoIdle来自UnsafeNativeMethods.IMsoComponent接口。

如何做到这一点?谢谢。

回答

2

你需要完全限定的方法名,因为他们使用显式接口实现:

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

根据记录,反映非公共成员一般是不好的做法,但你可能已经知道那。

编辑在教人以渔的精神,我想通了这一点由类型对象上调用GetMethods(...),并检查返回数组看到其方法是如何命名。当然,这些名字包括完整的命名空间规范。

+0

我曾尝试与UnsafeNativeMethods.IMsoComponent.FDoIdle但忘记了System.Windows.Forms前缀。感谢那。 – 2008-10-18 16:37:54

1

这是哈克,但这个工程:

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); 
    } 
} 

有匹配的目标方法的更万无一失的方法,但这种情况发生的工作这段时间:)

+0

也许不如查理写的那么明显,但非常有趣。 – 2008-10-18 16:46:25

相关问题