Как получить MethodInfo в классе ThreadContext? - PullRequest
2 голосов
/ 18 октября 2008

Я пытаюсь это:

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.

Как это сделать? Спасибо.

Ответы [ 2 ]

2 голосов
/ 18 октября 2008

Вам необходимо полностью указать имя метода, потому что они используют явную реализацию интерфейса:

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

Для справки, размышления о непубличных участниках, как правило, плохая практика, но вы, вероятно, уже знаете это.

РЕДАКТИРОВАТЬ В духе обучения человека ловить рыбу я понял это, вызвав GetMethods(...) для объекта типа и проверив возвращаемый массив, чтобы увидеть, как были названы методы. Конечно же, имена включали полную спецификацию пространства имен.

1 голос
/ 18 октября 2008

Хак, но это работает:

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

Существуют более надежные способы сопоставления целевого метода, но на этот раз это работает:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...