Announcement

Collapse
No announcement yet.

List All Functions(ExecutingAssembly) System.Reflection

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

  • List All Functions(ExecutingAssembly) System.Reflection

    Hi Leute,

    folgendes Problem habe ich:

    Ich suche nach einer Möglichkeit per Reflection alle Funktionen aus meiner Assembly aufzurufen - und nur die Funktionen die Protected Deklariert sind.

    Soweit bin ich gekommen:

    Code:
    Dim Info As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly
            Dim CrLf As String = System.Environment.NewLine()
            Try
                For Each Items As Type In Info.GetTypes()
                    If Items.IsPublic() Then
                        ListView1.Items.Add("Public" & " - " & Items.Name())
                    ElseIf Items.IsInterface() Then
                        ListView1.Items.Add("Interface" & " - " & Items.Name())
                    ElseIf Items.IsClass() Then
                        ListView1.Items.Add("Class" & " - " & Items.Name())
                    ElseIf Items.IsValueType() Then
                        ListView1.Items.Add("ValueType" & " - " & Items.Name())
                    End If
                Next
            Catch ex As System.Exception
                MessageBox.Show(ex.Message(), "Info - " & System.Reflection.MethodBase.GetCurrentMethod().Name())
            End Try
    Ich hoffe einer von Euch kann mir da weiterhelfen.
    Hab dazu auch noch mit den Membern herumexperimentiert was allerdings sicher der falsche Ansatz ist:

    Code:
    Private Sub GetMethod(ByVal t As System.Type)
            Dim pris() As PropertyInfo = t.GetProperties()
            For Each pi As PropertyInfo In pris
                Debug.Write(pi.Name)
                Debug.Write(pi.MemberType.ToString)
                Debug.Write(pi.PropertyType.ToString)
                If pi.CanRead Then
                    If pi.CanWrite Then
                        Debug.Write("Read/Write")
                    Else
                        Debug.Write("Read Only")
                    End If
                End If
            Next
            Dim mis() As MethodInfo = t.GetMethods()
            For Each mi As MethodInfo In mis
                If Not (mi.Name.Trim.StartsWith("get_") Or mi.Name.Trim.StartsWith("set_") Or mi.Name.Trim.StartsWith("add_") Or mi.Name.Trim.StartsWith("remove_")) Then
                    Debug.Write(mi.Name)
                    Debug.Write(mi.MemberType.ToString)
                    Debug.Write(mi.DeclaringType.ToString)
                End If
            Next
        End Sub
    SO long

    Yeti

  • #2
    Hab dazu auch noch mit den Membern herumexperimentiert was allerdings sicher der falsche Ansatz ist:
    Der Aufruf von Type.GetMethods() ist glaube ich der richtige Weg.
    Du kannst der Methode übrigens gleich die Einschränkungen auf die Sichtbarkeit gleichmitgeben.

    Code:
    t.GetMethods(BindingFlags.Public Or BindingFlags.Protected)
    Worüber bist du gestolpert das du glaubst das das so nicht geht?

    Comment


    • #3
      Hi Ralf - Thx für Deine Hilfe.


      Irgendwie blick ich den Wald vor lauter Bäumen nicht mehr. Ich hab die Sache jetzt mal stark verkürzt , aber leider bekomme ich auch nicht ansatzweise das raus das ich will.
      Code:
      Private Sub GetTypeM()
              Dim ts() As System.Type = System.Reflection.Assembly.GetExecutingAssembly.GetTypes
              Try
                  For Each t As Type In ts
                      'If t.IsClass Then
                      GetMethods(t)
                      'End If
                  Next
              Catch ex As System.Exception
                  MsgBox("Fehler in FillTypes: " & ex.Message)
              End Try
          End Sub
      
          Private Sub GetMethods(ByVal t As System.Type)
              For Each ma As MethodInfo In t.GetMethods()
                  ListView1.Items.Add(ma.ReturnType.ToString)
                  ListView1.Items.Add(ma.MemberType.ToString)
                  ListView1.Items.Add(ma.Name)
                  ListView1.Items.Add(ma.DeclaringType.ToString)
              Next
          End Sub
      Aber da bekomme ich nicht annähernd das raus das ich will...

      "t.GetMethods(BindingFlags.Public Or BindingFlags.Protected)"

      Das flag Protected gibts nicht .

      So long

      Yeti

      Comment


      • #4
        Das flag Protected gibts nicht .
        Sch.....ade. Wäre ja zu einfach gewesen. Da mußt du dur wohl doch alle Methoden ranholen, wobei GetMethods ohne Parameter nur öffentliche Methoden ranholt, und dann über MethodInfo.Attributes iterieren und filtern.

        Code:
        t.GetMethods(BindingFlags.Public or BindingFlags.NonPublic or BindingFlags.Static or BindingFlags.Instance)
        Ich hab übrigens diesmal auch gecheckt ob es die Flags gibt


        Soweit ich die Attribute verstehe die ein MethodInfo haben kann entspricht -

        'Family' - 'protected'
        'Family' und 'FamANDAssem' - 'public'

        Properties scheinen übrigens das 'SpecialName' Attribute zu tragen. Wobei ich mir nicht sicher bin ob das als Test reicht. Ist nicht ganz ersichtlich was noch alles als 'SpecialName' gilt.

        Comment


        • #5
          Ralf - ich danke Dir !

          so funktioniert es.

          Für die die es mal brauchen könnten hier der Code :

          Code:
          Private Sub GetTypes()
                  ListView1.Items.Clear()
                  Dim ts() As System.Type = System.Reflection.Assembly.GetExecutingAssembly.GetTypes
                  Try
                      For Each t As Type In ts
                          If t.IsClass Then
                              GetMethods(t)
                          End If
                      Next
                  Catch ex As System.Exception
                      MsgBox("Fehler in FillTypes: " & ex.Message)
                  End Try
              End Sub
          
              Private Sub GetMethods(ByVal t As System.Type)
                  For Each mi As MethodInfo In t.GetMethods(BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Static Or BindingFlags.Instance)
                      If Not (mi.Name.Trim.StartsWith("get_") Or mi.Name.Trim.StartsWith("set_") Or mi.Name.Trim.StartsWith("add_") Or mi.Name.Trim.StartsWith("remove_")) Then
                          If mi.IsFamily = True Then
                              Dim lvi As ListViewItem
                              lvi = ListView1.Items.Add(mi.Name)
                              lvi.SubItems.Add(mi.IsFamily.ToString)
                              lvi.SubItems.Add(mi.Name)
                              lvi.SubItems.Add(mi.Attributes.ToString)
                          End If
                      End If
                  Next
              End Sub
          So long

          Yeti

          Comment

          Working...
          X