Aufrufen privater / geschützter Methoden über Reflektion von derselben Objektinstanz (oder Basis)

8

Ist es möglich, eine geschützte Methode über Reflektion aufzurufen? Ich benutze das:

%Vor%

Was immer eine Methode ohne params oder return aufruft. Die Idee ist, dass der Benutzer meines Objekts (transaktionale Verarbeitung von Geschäftslogik) die Basisklassen-Adds in einer Ladung privater Methoden erbt, die ausgelöst werden sollen. Dann fügen sie diese Methodennamen zu einer Liste in der Reihenfolge hinzu, in der sie gefeuert werden sollen, und der obige Code sorgt dafür, dass sie ausgelöst werden.

Es funktioniert gut mit öffentlichen Methoden, aber nicht mit privaten oder geschützten Methoden in derselben Klasse (Geschützt, weil ich einige vorgefertigte Standardmethoden habe, die der Basisklasse hinzugefügt werden). Realistischerweise könnte ich die Methoden veröffentlichen und damit fertig werden, aber mein innerer Nerd wird es mir nicht erlauben ...

Ich gehe davon aus, dass dies ein Sicherheitsmerkmal ist. Gibt es eine Möglichkeit, dies zu umgehen, oder hat jemand irgendwelche Vorschläge, wie es weiter geht, aber halte meine leckeren, leckeren Sichtbarkeitsmodifikatoren in Takt?

(HINWEIS: ITS IN VB.NET, aber eine C # Antwort ist in Ordnung, wenn Sie sich damit auskennen).

    
deanvmc 05.01.2012, 14:43
quelle

3 Antworten

12

Wenn Sie die Methoden für ein instanziiertes Objekt aufrufen, benötigen Sie auch BindingFlags.Instance. So würde der Code aussehen (Hinweis: Ich habe auch die Option BindingFlags hinzugefügt, um öffentliche Mitglieder in die Suche einzubeziehen):

%Vor%

Weitere Informationen zur Verwendung finden Sie in der MSDN-Dokumentation .

BEARBEITEN

Um diese Antwort zu unterstützen, habe ich ein Testprogramm geschrieben, das den Aufruf der Methoden public , protected und private zeigt. Ich habe alle Klassen zu PasteBin hochgeladen. Es gibt drei Klassen, aus denen eine C # -Konsolenanwendung besteht. Sie können also zu einer Visual Studio-Lösung hinzugefügt und zum Testen ausgeführt werden.

  • Programm.cs - Richtet die Methoden ein, die aufgerufen werden sollen (in der Klasse SomeClass enthalten). Führt den Aufruf aus und gibt die Ergebnisse aus.
  • SomeClass.cs - Enthält drei Methoden für jeden Sichtbarkeitsmodifikator: public , protected und% Code%. Registriert sich selbst und die drei enthaltenen Methoden zum Aufruf durch die Klasse private .
  • Invoker.cs - Akzeptiert die Registrierung von Typen und Methoden, die aufgerufen werden sollen. Dann werden die registrierten Typen aufgelistet und die Methoden aufgerufen, wobei eine aufzählbare Sammlung von Ergebnissen erstellt wird.

Fühlen Sie sich frei, über diesen Code zu schauen und zu sehen, ob Sie irgendwelche Unterschiede darin finden können, wie Sie sich ihm nähern. Ich schätze es ist vielleicht nicht der einfachste Ansatz. Lassen Sie es mich wissen, wenn Sie weitere Fragen dazu haben.

    
Samuel Slade 05.01.2012, 15:18
quelle
4

Sie brauchen dazu keine Reflexion. Vielleicht habe ich missverstanden, was du erreichen wolltest, aber es klingt so, als würdest du eine Reihe von Methoden in eine andere Methode einbringen, sie irgendwie einwickeln. Sie können die privaten Methoden als Delegatparameter übergeben. Etwas wie das:

%Vor%

Subs Execute ruft den Code auf, den du in Base geschrieben hast, dann führt er A, dann B und schließlich alles aus, was du nach jedem für Base in Base deklariert hast.

    
Jeno Laszlo 05.01.2012 17:54
quelle
2

Verwenden Sie das NonPublic -Mitglied von BindingFlags , um alle einzuschließen die Methoden in deiner Klasse:

%Vor%     
ChrisF 05.01.2012 14:47
quelle

Tags und Links