Delegate::CreateDelegate
-
Hallo zusammen
Die delegates lassen mich nicht so los und ich bin nun doch einmal in Reflection hineingestolpert.
Also ich möchte einen Delegaten mittels Reflection erstellen. Folgender Code:
// Delegates.cpp: Hauptprojektdatei. #include "stdafx.h" #include "A.h" #include "B.h" using namespace System; using namespace System::Reflection; int main(array<System::String ^> ^args) { A^ a = gcnew A(); B^ b = gcnew B(); a->ConnectDelegate(b->GetType(), "MethodToCall"); return 0; }
#pragma once using namespace System; using namespace System::Reflection; ref class A { public: A(void) { }; delegate void DelegateMethod(void); void MethodToCall(void) { Console::WriteLine("Method called - Class A"); }; DelegateMethod^ DynamicDelegate; void ConnectDelegate(Type^ Instance, String^ Method) { // DynamicDelegate = (DelegateMethod^)Delegate::CreateDelegate(DelegateMethod::typeid, Instance, Method); DynamicDelegate = (DelegateMethod^)Delegate::CreateDelegate(DelegateMethod::typeid, Instance, Instance->GetMethod(Method)); }; };
#pragma once using namespace System; using namespace System::Reflection; ref class B { public: B(void) { }; void MethodToCall(void) { Console::WriteLine("Method called - Class B"); }; };
EDIT: Ups. Die Datei sollte auch noch mit in den Post.
Ich habe mal alles in die .h Datei geschrieben (der Einfachheit halber).
Also mit diesem Code bekomme ich eine Runtime Ausnahme "Fehler beim Binden an die Zielmethode".
Weiss jemand, wass ich falsch mache?
-
Richtig ist:
using namespace System; using namespace System::Reflection; ref class A { public: delegate void DelegateMethod(void); DelegateMethod^ DynamicDelegate; void ConnectDelegate(Object^ instance, String^ method) { DynamicDelegate = (DelegateMethod^)Delegate::CreateDelegate(DelegateMethod::typeid, instance, method, false); } void Call() { DynamicDelegate(); } }; ref class B { public: void MethodToCall(void) { Console::WriteLine("Method called - Class B"); } }; int main(array<System::String ^> ^args) { A^ a = gcnew A(); B^ b = gcnew B(); a->ConnectDelegate(b, "MethodToCall"); a->Call(); return 0; }
-
Ach ich D... vor lauter Bäumen den Wald nicht mehr sehen.
Object^ und nicht Type^
Vielen Dank - ich hätte da wohl noch länger gesucht.