webentwicklung-frage-antwort-db.com.de

Zugriff auf interne Klassen mithilfe von Reflection

Wie kann ich auf eine interne Klasse einer Assembly zugreifen? Angenommen, ich möchte auf System.ComponentModel.Design.DesignerHost zugreifen. Hier ist der DesignerHost eine interne und versiegelte Klasse.

Wie kann ich einen Code schreiben, um die Assembly und den Typ zu laden?.

62
dattebayo

Im Allgemeinen sollte nicht tun Sie dies - wenn ein Typ als intern markiert wurde, bedeutet dies, dass Sie ihn nicht von außerhalb der Assembly verwenden sollen. Es könnte in einer späteren Version entfernt, geändert usw. werden.

Allerdings können Sie mit reflection does auf Typen und Member zugreifen, die nicht öffentlich sind - suchen Sie nach Überladungen, die ein BindingFlags -Argument annehmen und BindingFlags.NonPublic In einschließen die Fahnen, die Sie passieren.

Wenn Sie den Namen voll qualifiziert haben des Typs (einschließlich der Assembly-Informationen) haben, sollte nur der Aufruf von Type.GetType(string) funktionieren. Wenn Sie die Assembly im Voraus kennen und einen öffentlichen Typ in dieser Assembly kennen, ist es im Allgemeinen einfacher, mit typeof(TheOtherType).Assembly die Assembly-Referenz abzurufen, und Sie können Assembly.GetType(string) .

96
Jon Skeet

So laden Sie die Assembly und geben den in Ihrem Beispiel angegebenen Namen ein:

Assembly design = Assembly.LoadFile(@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Design.dll");
Type designHost = design.GetType("System.ComponentModel.Design.DesignerHost");
14