Berufung auf Private / Protected-Methoden Per Reflection Von Der Gleichen Objekt-Instanz (oder Base)
Ist es möglich, Aufruf einer geschützten Methode per reflection. Ich bin mit diesem:
Me.GetType.InvokeMember(Stages(CurrentStage),
Reflection.BindingFlags.InvokeMethod,
Nothing,
Me,
Nothing)
Die immer ruft eine Methode ohne Parameter oder return. Die Idee ist, dass der Benutzer des Objekts (transaktionale Verarbeitung von business Logik) erbt die Basisklasse fügt in einer Last von privaten Methoden, um Feuer. Dann fügen Sie diese Methode, die Namen auf einer Liste in der Reihenfolge, wie Sie möchte, Sie feuerte, und der obige code kümmern gefeuert.
Es funktioniert gut mit öffentlichen Methoden, aber nicht mit private oder protected-Methoden in der gleichen Klasse (Geschützt, weil ich einige "standard" - pre gebaut Methoden hinzufügen, um die Basis-Klasse). Realistisch, ich könnte die Methoden public und mit ihm getan werden, aber mein innerer nerd nicht mir erlauben, so zu tun...
Ich nehme an das ist ein Sicherheits-feature. Gibt es eine Möglichkeit das zu umgehen oder hat jemand irgendwelche Vorschläge auf, wie Sie gehen, aber halten Sie meine lecker, lecker Sichtbarkeit Modifikatoren in Takt?
(HINWEIS: die IN VB.NET aber ein C# - Antwort ist in Ordnung, wenn das ist, was Sie mit vertraut sind).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie aufrufen von Methoden auf ein Objekt instanziiert, werden Sie auch brauchen, BindingFlags.Instanz. Also der code würde wie folgt Aussehen (Hinweis: ich habe auch Hinzugefügt der BindingFlags-option auch auf öffentliche member in die Suche):
Weitere Informationen zur Verwendung entnehmen Sie bitte dem MSDN-Dokumentation.
BEARBEITEN
Unterstützen, diese Antwort, die ich geschrieben habe ein test-Programm veranschaulicht den Aufruf
public
,protected
undprivate
- Klasse Methoden. Hochgeladen habe ich alle Klassen auf PasteBin. Es gibt drei Klassen in einem C# Konsole-Anwendung, so kann Hinzugefügt werden, um eine Visual Studio-Projektmappe, und führen Sie zu testen.SomeClass
Klasse). Führt der Aufruf und druckt die Ergebnisse.public
,protected
undprivate
. Auch registriert Sie sich und die drei enthaltenen Methoden für den Aufruf von derInvoker
Klasse.Fühlen Sie sich frei, um einen Blick über den code ein und sehen Sie, wenn Sie finden alle Unterschiede, wie Sie sich nähern. Ich Schätze es ist vielleicht nicht die einfachsten Ansätze, aber. Lassen Sie mich wissen, wenn Sie weitere Fragen haben, auf es.
private
zu - ich habe geschrieben eine einfache test-Anwendung, die bestätigt, dass.Können Sie nicht brauchen, Reflexion für diese. Vielleicht habe ich missverstanden, was Sie erreichen wollte, aber es klingt wie Sie wollen zu injizieren eine Reihe von Methoden, die zu einer anderen Methode, ein bisschen einwickeln. Sie kann in der privaten Methoden als Delegierter params. So etwas wie dieses:
Sub ' s starten, rufen Sie den code, den Sie schrieb in der Basis wird es dann ausführen A, dann B und schließlich alles, was Sie erklärt, nach der für jedes in der Base.
Verwenden Sie die
NonPublic
Mitglied ausBindingFlags
, die alle Methoden in Ihrer Klasse: