Herausfinden von welchem delegate Funktionsaufruf kam **gelöst**
-
Hi Leute,
ich habe in CLI/C++ ein delegate und eine Klasse die so eins als member hat
public delegate void tdelTest(unsigned long Param1); public ref class CTestClass { // ... public: event tdelTest ^OnTest; }
jetzt mache ich in C# zwei instanzen, sowie einen Funktion für mein Delegate.
CTestClass test1 = new CTestClass(); test1.OnTest += new tdelTest(TestFunction); CTestClass test1 = new CTestClass(); test2.OnTest += new tdelTest(TestFunction); public void TestFunction(uint Param1) { }
wenn jetzt TestFunction aufgerufen wird möchte ich wissen aus welchem delegate also aus welcher Instanz heraus diese Aufgerufen wird.
In C++ würde ich dem Delegate einen void Pointer mit geben der dann mit dem this Zeiger gefüllt wird, da es in C# zu unsafe Code führen würde einen Pointer zu verwenden frage ich mich welche Möglichkeiten ich in C# habe?
MfG
-
Benutze doch System.Object bzw. object.
MS gibt als Guideline folgendes Pattern für Events vor:
public class MyEventHandlerArgs { // ... } public delegate void MyEvenHandler(object sender, MyEventHandlerArgs e);
Dabei ist sender, der Aufrufer (Du gibst also this mit beim Aufruf des Delegaten).
Falls Daten transportiert werden müssen, werden sie in die *Args Klasse gepackt.Simon
-
wie muss ich das delegat den in C++/CLI definieren denn dort kennt der object nicht?
public delegate void tdelTest(System::Object sender,unsigned long Param1); public ref class CTestClass { // ... public: event tdelTest ^OnTest; } OnOnTest(this,1);
bekomme ich folgende Fehler:
error C2664: tdelTest::Invoke': Konvertierung des Parameters 1 von 'System::Object' in 'System::Object' nicht möglich Konstrukt-class "System::Object" kann aufgrund eines mehrdeutigen oder nicht verfügbaren Kopierkonstruktors nicht kopiert werden.
error C2664: 'OnTest::raise': Konvertierung des Parameters 1 von 'CTestClass ^const ' in 'System::Object' nicht möglich Es ist kein benutzerdefinierter Konvertierungsoperator verfügbar, oder Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werdenMfG
-
so gehts:
public delegate void tdelTest(const System::Object ^const oSender, unsigned long Param1); public ref class CTestClass { // ... public: event tdelTest ^OnTest; } OnOnTest(this,1);
und
CTestClass test1 = new CTestClass(); test1.OnTest += new tdelTest(TestFunction); CTestClass test1 = new CTestClass(); test2.OnTest += new tdelTest(TestFunction); public void TestFunction(object sender, uint Param1) { int testint; if (sender == test1) testint = 5; else if (sender == test2) testint = 10; else testint = 20; }