我正在尝试这个:
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接口。
怎么做?感谢。
答案 0 :(得分:2)
您需要对方法名称进行完全限定,因为它们使用显式接口实现:
Type type = typeof( Application ).GetNestedType( "ThreadContext",
BindingFlags.NonPublic );
MethodInfo doIdle = type.GetMethod(
"System.Windows.Forms.UnsafeNativeMethods.IMsoComponent.FDoIdle",
BindingFlags.NonPublic | BindingFlags.Instance );
对于记录,反映非公开成员通常是不好的做法,但你可能已经知道了。
编辑本着教导一个人钓鱼的精神,我通过在类型对象上调用GetMethods(...)
并检查返回的数组以查看方法的命名方式来解决这个问题。果然,名称包括完整的命名空间规范。
答案 1 :(得分: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);
}
}
有更多可靠的匹配目标方法的方法,但这次会发生这种情况:)