Unter Programmierern wird häufig belächelt, welche Entwicklung die traditionelle „Hello World“-Anfängeranwendung infolge der zunehmenden Kenntnisse des Entwicklers nimmt. Am Anfang steht der allseits bekannte und beliebte simple Einzeiler, der dann mehrere Phasen durchläuft und schließlich in seitenlangem, stark objekt-orientiertem C++-Code endet, mit demselben Ergebnis wie der ursprüngliche Einzeiler. Diesen Vorgang sollten Sie sich vor Augen halten, wenn Sie den C#-Source-Code in Listing B betrachten, der den Reflection-Methodenaufruf verwendet, um eine ähnlich umfassende Umsetzung der bewährten „Hello World“-Anwendung zu erreichen.
Der entscheidende Vorgang liegt hier in der Methode LateBoundCall, die eine Instanz von HelloHello akzeptiert und auf System.Object konvertiert und die InvokeMember-Methode der Type-Klasse zum spät gebundenen Aufruf von HelloHello.SaySomething verwendet. Diese Funktionalität eignet sich für Fälle, in denen Sie eine Methode für ein Objekt aufrufen müssen, ohne dessen exakten Typ zu kennen. InvokeMember akzeptiert bestimmte Parameter, die den Namen und den Typ der aufzurufenden Methode angeben, wie der Aufruf ausgeführt werden soll und welche Argumente an die aufgerufene Methode übergeben werden sollen. Die Parameter zum einfachen Überschreiben von InvokeMember sowie deren Bedeutungen sind in Tabelle B aufgeführt.
name | Ein String mit dem Namen des aufzurufenden Members |
invokeAttr | Eine Bitmaske aus System.Reflection.BindingFlags-Werten, die angeben, auf was für ein Member zugegriffen werden soll, wie die Reflection-API nach dem genannten Member suchen soll und wie das Member aufgerufen werden soll. Sie müssen mindestens einen Access Descriptor-Wert angeben (verwenden Sie InvokeMethod um einfach eine bekannte Methode aufzurufen) |
binder | Ein System.Reflection.Binder-Objekt, das Kriterien wie Typanpassung und die Auswahl der geeigneten überladenen Methode überprüft. In den meisten Fällen kann null oder Nothing übergeben und der Standardbinder verwendet werden |
target | Eine Instanz des Objekts, über das ein Member aufgerufen werden soll |
args | Ein Objekt-Array mit allen Argumenten, die an ein Member übergeben werden sollen |
Tabelle B: Erklärung der Parameter für InvokeMethod
Sparsamer Gebrauch
Obwohl die Reflection-Features von .NET eine äußerst wirkungsvolle Vorgehensweise zur Ermittlung der Eigenschaften eines Objekts während der Laufzeit bieten, sollten sie wirklich nur im Bedarfsfall verwendet werden, da die Untersuchung der Metadaten für eine Klasse sowie der spät gebundene Methodenaufruf sehr rechenintensive Verfahren darstellen.
Ohne eine kostenlose Alternative, die ohne Zustimmung zur Verarbeitung personenbezogener Daten zu Werbezwecken auskommt, ist…
LabHost gilt als einer der größten Phishing-Dienstleister weltweit. Die Ermittler verhaften 37 Verdächtige, darunter der…
Neuer Datendurchsatz-Rekord an Europas größtem Internetknoten parallel zum Champions-League-Viertelfinale.
Die neuen Chips bieten bis zu 25 Prozent mehr Leistung. Samsung steigert auch die Energieeffizienz…
Betroffen sind Lösungen von Cisco, Fortinet, SonicWall und anderen Anbietern. Die Hacker nehmen Konten mit…
Immer häufiger müssen sich Betriebe gegen Online-Gefahren wehren. Vor allem in KMUs werden oft noch…