首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ThreadContext类中获取MethodInfo?

如何在ThreadContext类中获取MethodInfo?
EN

Stack Overflow用户
提问于 2008-10-18 16:13:24
回答 2查看 675关注 0票数 2

我试着这样做:

代码语言:javascript
复制
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为null。我知道GetMethod调用有问题,因为FDoIdle来自UnsafeNativeMethods.IMsoComponent接口。

如何做到这一点?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2008-10-18 16:32:54

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

代码语言:javascript
复制
Type type = typeof( Application ).GetNestedType( "ThreadContext",
    BindingFlags.NonPublic );
MethodInfo doIdle = type.GetMethod(
    "System.Windows.Forms.UnsafeNativeMethods.IMsoComponent.FDoIdle",
    BindingFlags.NonPublic | BindingFlags.Instance );

根据记录,反思非公共成员通常是不好的做法,但您可能已经知道这一点。

编辑本着教人去钓鱼的精神,我通过在类型对象上调用GetMethods(...),并检查返回的数组来查看方法是如何命名的,从而解决了这一问题。果然,名称包含了完整的名称空间规范。

票数 2
EN

Stack Overflow用户

发布于 2008-10-18 16:35:34

虽然有点老生常谈,但这是可行的:

代码语言:javascript
复制
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);
    }
}

有更多可靠的方法来匹配目标方法,但这一次恰好有效:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/215213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档