Как вызвать метод в экземпляре класса ref с помощью отражения, которое возвращает собственный указатель? - PullRequest
2 голосов
/ 01 июля 2011

Я пытаюсь вызвать метод для экземпляра класса ref с помощью отражения, которое возвращает собственный указатель.

Пример заголовка класса ref:

public ref class MyRefClass : public IDisposable
{
public:

MyNativeType* GetNativeInstance();

//Rest of the header...
}

вот пример неудачной попытки отражения

void InvokeTheMethod(Object^ obj)
{
     MyNativeType* myNative;
     GetNativeInvoker^ del = (GetNativeInvoker^) Delegate::CreateDelegate(GetNativeInvoker::typeid, obj, "GetNativeInstance");

     //get pointer and use if bind succeeds myNative = del();
     //else handle the case where the Object does not have GetNativeInstance()
}

с использованием этого делегата

delegate MyNativeType* GetNativeInvoker();

При попытке создать делегат связывание завершается неудачно с ArgumentException, даже если объект является экземпляром класса ref, который имеет метод "GetNativeInstance" (например, MyRefClass). Эту проблему нужно решить, ничего не зная о типе obj во время компиляции, кроме факта, что это Object^.

1 Ответ

2 голосов
/ 02 июля 2011

Проблема в том, что вы не используете Reflection. Delegate :: CreateDelegate () разрешен только для типов делегатов, ваш не один. Используйте Reflection для исправления, Type :: GetMethod () возвращает метод. Вот так (без очистки):

using namespace System;
using namespace System::Reflection;

class MyNativeType {};

public ref class MyRefClass
{
    MyNativeType* instance;
public:
    delegate void* GetNativeInvoker();

    MyRefClass() { instance = new MyNativeType; }
    MyNativeType* GetNativeInstance() { return instance; }

    static void Test() {
        MyRefClass^ obj = gcnew MyRefClass;
        MethodInfo^ mi = obj->GetType()->GetMethod("GetNativeInstance");
        Object^ result = mi->Invoke(obj, nullptr);
        void* ptr = Pointer::Unbox(result);
        System::Diagnostics::Debug::Assert(ptr == obj->GetNativeInstance());
    }
};
...