Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0005: Methoden über ihren Namen aufrufen - CallByName

 von 

Beschreibung

Mit CallByName() konnte man schon unter VB6 eine Methode, Funktion oder Eigenschaft über ihren Namen identifizieren und aufrufen. Diese Option besteht unter VB.NET zwar weiter, aber es gibt auch eine neue, flexiblere Möglichkeit namens Reflection, welche man über System.Type-Objekte nutzen kann. Unumgänglich ist dies auch in C#, da dort CallByName() nicht existiert.

Zwar kann man per Reflection viele interessante Informationen auslesen, man muss sich aber ins Gedächtnis rufen, dass mit ihr aus Design- und Geschwindigkeitsgründen sparsam umgegangen werden sollte. Es lohnt sich erst zu überlegen, ob der Effekt nicht ebenfalls durch andere Mittel wie beispielsweise Schnittstellen erreicht werden könnte.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Framework-Version(en):

.NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5

.NET-Version(en):

Visual Basic 2005, Visual Basic 2008

Download:

Download des Beispielprojektes [8,55 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2008
' Option Strict:    Aus
' Option Explicit:  An
' Option Infer:     An
'
' Referenzen: 
'  - System
'  - System.Data
'  - System.Deployment
'  - System.Xml
'  - System.Core
'  - System.Xml.Linq
'  - System.Data.DataSetExtensions
'
' Imports: 
'  - Microsoft.VisualBasic
'  - System
'  - System.Collections
'  - System.Collections.Generic
'  - System.Data
'  - System.Diagnostics
'  - System.Linq
'  - System.Xml.Linq
'

' ##############################################################################
' ################################ Methods.vb ##################################
' ##############################################################################
' Ein paar Methoden zum Testen
Public Class Methods
    Private mValue As Long

    ' Shared-Sub
    Public Shared Sub HelloWorld()
        Console.WriteLine("Hallo, Welt")
    End Sub

    ' Wert anzeigen
    Public Sub ShowValue()
        Console.WriteLine("Wert: {0}", Value)
    End Sub

    ' Wert setzen oder schreiben
    Public Property Value() As Long
        Get
            Return mValue
        End Get
        Set(ByVal rhs As Long)
            mValue = rhs
        End Set
    End Property

    ' Zwei Strings hintereinander hängen
    Public Function Foo(ByVal Param1 As String, _
        ByVal Param2 As String) As String

        Return Param1 & Param2
    End Function

    ' Noch eine Sub
    Public Sub InvokeMe()
        Console.WriteLine("Ich wurde aufgerufen!!")
    End Sub

End Class

' ##############################################################################
' ################################ Module1.vb ##################################
' ##############################################################################
Imports System.Reflection

Module Module1
    Sub Main()
        Dim Instanz As New Methods
        Dim Typ As System.Type = GetType(Methods)

        ' Mit CallByName 
        Console.WriteLine("------ CallByName -------")
        Console.WriteLine()

        CallByName(Instanz, "ShowValue", CallType.Method)
        CallByName(Instanz, "Value", CallType.Let, 42)
        Console.WriteLine("Ausgelesener Wert: {0}", _
            CallByName(Instanz, "Value", CallType.Get))
        Console.WriteLine("Methodenaufruf: {0}", _
            CallByName(Instanz, "Foo", CallType.Method, "Hallo, ", "Welt"))

        ' Für statische Member muss eine Instanz übergeben werden
        CallByName(Instanz, "HelloWorld", CallType.Method)

        Instanz.Value = 0

        ' Mit Type und Reflection
        Console.WriteLine()
        Console.WriteLine("------ System.Type/Reflection -------")
        Console.WriteLine()

        ' Mehthoden und Eigenschaften aufrufen
        Typ.GetMethod("HelloWorld").Invoke(Nothing, Nothing)
        Typ.GetMethod("ShowValue").Invoke(Instanz, Nothing)
        Typ.GetProperty("Value").SetValue(Instanz, 42, Nothing)
        Console.WriteLine("Ausgelesener Wert: {0}", _
            Typ.GetProperty("Value").GetValue(Instanz, Nothing))
        Console.WriteLine("Methodenaufruf: {0}", _
            Typ.GetMethod("Foo").Invoke(Instanz, _
                New Object() {"Hallo, ", "Welt"}))

        ' Alle parameterlosen, öffentlichen Subs aufrufen
        For Each Methode In Typ.GetMethods
            If Methode.GetParameters.Count = 0 And _
                Methode.IsPublic And Methode.ReturnType Is GetType(Void) Then

                Console.Write(Methode.Name & " => ")
                Methode.Invoke(Instanz, Nothing)
            End If
        Next

        Console.ReadKey()
    End Sub
End Module

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.