VB.NET-Tipp 0005: Methoden über ihren Namen aufrufen - CallByName
von Dario
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: | 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: |
' 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.