Frage

habe ich Reflexion viele Male zuvor auf öffentliche Methoden, aber ich habe nie bemerkt, dass private Methoden zu aufgerufen werden können. Siehe Reflexion mit privaten Mitgliedern .

Warum ist das in erster Linie erlaubt? Ist das nicht geht die Herrschaft des „private“ ist „privat“ zu brechen?

War es hilfreich?

Lösung

private in C # ist wirklich nur ein Teil der Sprachspezifikation; in der Sprache C #, sowie in der Sprache Visual Basic oder andere sensible .NET-Sprache (einschließlich CIL , was die alle .NET-Sprachen kompilieren) ein von den Zugriff auf eine private verhindert wird (oder protected, wenn Sie nicht innerhalb einer abgeleiteten Klasse) Mitglied in der Sprache . Allerdings nur, weil die Sprache nicht unterstützt öffentlich private oder protected Mitglieder Zugriff bedeutet nicht, , um den zugrunde liegenden Framework kann keinen Zugang zu den Mitgliedern zur Verfügung stellen.

Dies ist einer jener Fälle, in denen man in der Regel sollte nicht sein Abhilfen wie Reflexion mit private oder protected Member zuzugreifen oder zu ändern, aber der Rahmen kann man sowieso. Im Allgemeinen sollten Sie einen sehr guten Grund private oder protected Mitglieder zuzugreifen; ein solcher Grund ist beispielsweise die Implementierung eines Serializer, die bei der Objekt internen Zustand aussehen muss, um richtig das Objekt serialisiert werden soll. Wenn Sie nicht so etwas tun, sollten Sie wirklich sehen Sie die Klasse Neuimplementierung um innerhalb Sie stoßen, so dass Sie nicht brauchen, um Reflexion in Ihrem Programm zu verwenden.

Andere Tipps

Das ist nur zulässig, wenn der Code unter voller Vertrauenswürdigkeit ausgeführt wird (oder mit der entsprechenden Berechtigung). Andernfalls wird ein MethodAccessException geworfen werden.

Der Rahmen ist durchaus in der Lage den Zugang in geeigneter Weise zu beschränken - es ist nicht nur nicht tun, wenn Sie unter vollem Vertrauen laufen oder wenn Sie bestimmte Berechtigungen verfügen. Siehe „Sicherheitsüberlegungen für die Reflektion“ für mehr Details, wenn Sie‘ re in der Lage, dies zu tun.

Ja, es macht die Regel brechen. Ich würde fast nie Code während einer Revue passieren, wenn jemand dies getan hat.

Reflexion mit einer Methode zu nennen, ist slllloooow, nicht typsicher und bricht leicht, wenn die zugrunde liegende Klasse, um die privaten Methoden überarbeitet hat.

kurz Also, ich stimme zu, dass es eine schlechte Idee!

Dies ist fortschrittliche Leistung, die Sie aus dem Rahmen erhalten. Es ist sehr ungewöhnlich, es in der Produktion Code zu verwenden, für die Methoden aufrufen, es bricht die Vorteile der Mitglieder versteckt.

Es gibt einige Orte, wo es sinnvoll sein kann:

  • Legacy-Code-Tests - zum Beispiel annimmt, dass Sie mit Legacy-Code arbeiten und Sie wollen es mit Unit-Tests zu decken. Wenn Sie nicht erlaubt sind, den Code zu ändern, und Sie wollen kleinen Teil der Funktionalität testen Berufung auf private Methoden ist sinnvoll.
  • Hacks im Produktionscode - Ich traf einmal einen Fehler in 3rd-Party-Kontrolle, wo in einigem Szenario eine private Bereinigung nicht geschehen. Ich private invoke verwendet, könnte es umgehen.

Es ist nichts falsch mit dem Rahmen diese Funktionalität bereitstellt, aber mit ihm, wo es ist kein Muss falsch ist.

Die Reflexion ist eine leistungsfähige Funktionalität in .NET, aber hat auch seine Nachteile.

Vorteile:

  1. Reflektionen erlaubt alle Mitglieder Zugriff (einschließlich der privaten und geschützten), vorausgesetzt, dass Sie zumindest die Reflection Sicherheit. (Diese Berechtigung kann gewonnen werden, wenn die Anwendung die reflektierte Baugruppe aus dem gleichen Laufwerk zugreift, nicht aus dem Internet.)

  2. In einigen seltenen Fällen, Reflexion ist der einzige Weg, um eine Aufgabe zu erfüllen.

Nachteile:

  1. Reflexion bricht Sicherheit (wie auch decompiling eine Baugruppe). Gewinnen vollständige Sicherheit über Ihre Anwendung Code und Daten, Sie Kryptographie verwenden müssen, nicht nur verlassen sich auf den privaten oder geschützten Keywords, denn wenn allein, kann leicht durch Reflexion oder Dekompilierung gebrochen werden.

  2. Die Reflexion ist wesentlich langsamer und mehr Ressourcen als statische Referenzierung verbraucht (die normale Art und Weise Sie Methoden aufrufen). Aus diesem Grunde sollten Sie Reflexion vermeiden, es sei denn dies ist der einzige Weg, Ihr Problem zu lösen.

Beispiele aus, wenn Reflexion ist der einzige Weg, das Problem zu lösen folgen:

  1. Angenommen, Ihre Anwendung dynamisch Code kompiliert (wie wenn Sie Funktionen sind Plotten, die der Benutzer zur Laufzeit zur Verfügung stellen). In solchen Fällen ist der einzige Weg, um die Baugruppen und Typen zu laden durch Reflexion.

  2. Sie wollen ein Objekt klonen. Sie müssen Reflexion nutzen, um seine privaten Felder zugreifen zu können.

Ich hoffe, das hilft. Ich sollte hier Herr Francesco Balena für sein schönes Buch danken, Programmierung Microsoft Visual Basic 2005:. Die Sprache

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top