2009-08-11 13 views
50

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

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

Antwort

78

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

jedoch Reflexion tut ermöglicht es Ihnen, Typen und Member zuzugreifen, die nicht öffentlich sind - nur für Überlastungen suchen, die nehmen ein BindingFlags Argument und umfassen BindingFlags.NonPublic in den Flaggen, die Sie weitergeben.

Wenn Sie den voll qualifizierten Namen des Typs (einschließlich der Baugruppeninformationen) haben, dann sollte nur Type.GetType(string) Aufruf sollte funktionieren. Wenn Sie die Baugruppe im Voraus kennen und über einen öffentlichen Typ in dieser Baugruppe Bescheid wissen, ist die Verwendung von typeof(TheOtherType).Assembly zum Abrufen der Baugruppenreferenz in der Regel einfacher, und Sie können dann Assembly.GetType(string) aufrufen.

+8

@dattebayo: nur Jon Antwort zu vervollständigen, beachten Sie, dass der Code in voller Vertrauen ausgeführt werden muss, oder Reflexion über nicht-öffentliche Mitglieder werden scheitern –

+1

Manchmal muss man einfach, bis es kaputt geht. Ich habe einen WPF 'DataGrid' Befehl, dessen Parameter' SelectedItems' ist. In dem Befehl wird der Parameter als "Objekt" empfangen, aber vom Typ "SelectedCellCollection", auf den in meinem Code nicht zugegriffen werden kann. Ich brauche diese Art von Cheat in der Hoffnung, den 'object' Parameter auf eine' SelectedCellCollection' zu übertragen. – ProfK

9

die Baugruppe zu laden und Sie in Ihrem Beispiel zitiert Typ:

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

Sie können einfach Assembly.Load ("System.Design, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089") ' – abatishchev

+3

Wenn Sie nur einen Typ benötigen, können Sie das Laden der Assembly explizit überspringen:' var designHost = Typ .GetType ("System.ComponentModel.Design.DesignerHost, System.Design, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089"); ' –

Verwandte Themen