Ich habe eine Situation, in der ich die Methode der Schnittstelle mit Reflektion aufrufen muss, so wie diese
%Vor%Wie Sie sehen können, erstelle ich keine Instanz eines Objekts! Und, wie ich annehmen kann, erhalte ich eine Ausnahme
Nicht-statische Methode erfordert ein Ziel
Und Frage, kann ich Methode der Schnittstelle mit Reflexion aufrufen, ohne Instanz der Schnittstelle zu erstellen und wenn JA, Wie kann ich es tun?
Wenn Sie absolut sicher sind, dass sich die Schnittstellenmethode nicht auf den Objektstatus auswirkt (und das ist im Allgemeinen eine sehr schlechte Annahme), könnten Sie eine Instanz ohne Aufruf des Konstruktors erstellen, indem Sie FormatterServices.GetUnitializedObject . Persönlich würde ich dringend davon abraten, da jede Menge schlechter Dinge passieren können, wenn Sie eine Interface-Methode auf einem nicht initialisierten Typ aufrufen.
Wenn es sich um eine Instanzmethode handelt, benötigen Sie eine Instanz, mit der Sie die Methode aufrufen können. Daher "Instanz" -Methode.
Instanzmethoden können Abhängigkeiten von Instanzvariablen haben, über die die Reflektion nicht informiert wäre. Daher kann nicht garantiert werden, dass eine Instanzmethode den Zustand der Instanz des Typs, in dem sie definiert ist, nicht ändert.
Aus diesem Grund erhalten Sie diese FxCop-Warnungen (hier paraphrasieren) "Machen Sie diese Methode statisch, da sie den Zustand der Klasse nicht verändert".
Wenn die Methode nicht statisch ist, müssen Sie eine Objektinstanz erstellen, um sie zu verwenden. Da Schnittstellen keine statischen Methoden haben können, müssen Sie eine Instanz eines Objekts mit der Schnittstelle erstellen, um die Methode auszuführen.
Eine Schnittstelle hat keine Implementierung, so dass Sie ihre Methode nicht ohne eine Instanz eines Objekts aufrufen können, das diese Schnittstelle implementiert.
Können Sie eine Schnittstellenmethode aufrufen, ohne eine Instanz zu erstellen? Nein. Schnittstellen sind zum Beispiel Mitglieder; Statische Klassenmitglieder sind nicht mit Schnittstellen verbunden.
Sie können möglicherweise erhalten, was Sie wollen, indem Sie eine statische Implementierung der Schnittstelle bereitstellen,
%Vor%Oder Sie könnten eine Erweiterungsmethode machen:
%Vor%Tags und Links .net c# reflection