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 werden

    MfG



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

Anmelden zum Antworten