Announcement

Collapse
No announcement yet.

Methode der Instanz aufrufen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Methode der Instanz aufrufen

    Ich habe eine neue Klasse erstellt mit einem Array vom Typ Object.

    Public Class Beispiel

    Dim objArray(10,10) As Object

    ...

    End Class
    In dem Array werden alles Klassen gespeichert, welche Controls darstellen (also TextBoxen, PictureBoxen usw.).

    Ich möchte nun in dieser Klasse eine Methode der in dem Array gespeicherten Controls über den Namen der Methode aufrufen.

  • #2
    Methoden können per CallByName() über ihren Namen angesprochen werden. Voraussetzung: die Methode ist Public. Andernfalls führt Reflection zum Ziel: objArray(0, 0).GetType().GetMethod() ermittelt eine System.Reflection.MethodInfo-Instanz. Deren Invoke()-Methode ruft die gewünschte Methode der Control-Instanz auf (siehe hier).

    Comment


    • #3
      Wenn es Controls sind solltest du auch ein Array von Control nehmen und nicht Object. Wenn die Methode die du gerne aufrufen möchtest in Control implementiert wurde wäre dein Problem des Methodenaufrufs auch damit bereits erledigt.

      Comment


      • #4
        Originally posted by Ralf Jansen View Post
        Wenn es Controls sind solltest du auch ein Array von Control nehmen und nicht Object. Wenn die Methode die du gerne aufrufen möchtest in Control implementiert wurde wäre dein Problem des Methodenaufrufs auch damit bereits erledigt.
        Mit Control funktioniert es leider nicht, weil es abgeleite Klassen von Standard-Steuerelementen sind, bei denen noch eigene Properties und Methoden hinzugefügt worden sind.

        Werde es mal mit Invoke usw. von der Antwort davor versuchen.

        Comment


        • #5
          Kennt NET die Möglichkeit, an einem Object zu prüfen, was für eine Instanz (Klasse) es ist und dann zu casten?

          Also zu obigem Fall

          Wenn objArray(0,0) ein Instanz einer Textbox ist
          Textbox tb=(Textbox)objArray(0,0)

          Methodenaufrufe der Textbox
          tb. .....
          Christian

          Comment


          • #6
            Noch ein Nachtrag: CallByName sollte nur verwendet werden, wenn zur Compilationszeit der Name der Methode nicht bekannt ist, der aufzurufende Methodenname erst zur Laufzeit als Zeichenfolge bekannt ist. Andernfalls ist natürlich selbst ein LateBinding objArray(0, 0).MyMethod() vorzuziehen. Analoges gilt für den Aufruf einer Methode über eine MethodInfo-Instanz, zumindest solange es sich um eine öffentliche Methode handelt, erweitert um Anwendungsfälle, in den zwar die Methode zur Compilationszeit bekannt ist, aber nicht, ob die vorliegende Klasseninstanz diese Methode auch implementiert (siehe letztes Beispiel).
            Wie bereits von Christian erwähnt, läßt sich per TypeCasting sogar vom Compiler zu überprüfenden Code erzeugen.

            [highlight=vbnet]If TypeOf objArray(0, 0) Is MyClass1 Then
            CType(objArray(0, 0), MyClass1).MyMethod1()
            ElseIf TypeOf objArray(0, 0) Is MyClass2 Then
            CType(objArray(0, 0).MyMethod2()
            End If[/highlight]

            Eine solche Vorgehensweise hat in jedem Fall den Vorteil, schnellen Code zu erzeugen. Methodenaufrufe eines bekannten Types sind deutlich schneller als ein LateBinding, CallByName oder Aufruf per Reflection.

            Anwendungsfall: Methode bekannt, aber nicht, ob sie von objArray(0, 0) implementiert wird.
            In einem solchen Fall wird per Reflection versucht, eine MethodInfo zu ermitteln. Wird eine MethodInfo-Instanz gefunden, führt man die Methode per MethodInfo.Invoke() aus. Schlecht wäre ein Ansatz wie der folgende

            Code:
            Try
               CallByName("MyMethod", ...) oder auch objArray(0, 0).MyMethod()
            Catch ex As Exception
            End Try
            Ist die Methode MyMethod() nicht existent, wird eine Exception ausgelöst. Diese wird zwar aufgefangen, aber Exceptions kosten eine Menge Prozessorzeit und sollten vermieden werden. Zumindest in den Fällen wie diesen, da der zeitintensive Fehlerfall komplett verschluckt wird.

            Comment


            • #7
              eventuelle Lösung

              Ich möchte hier noch kurz schreiben, wie ich das Problem gelöst habe (könnte eventuell auch andere interessieren).

              1. Ich ermittle mit GetType den Type des gewünschten Objects
              2. In dem ermittelten System.Type hole ich mit GetMethod(strMethodenname) die MethodInfo der gesuchten Methode.
              3. Ich rufe bei der MethodInfo Invoke auf und übergebe das gewünschte Object und als zweite Übergabe Nothing.

              Comment

              Working...
              X