2009-08-11 2 views
50

Как получить доступ к внутреннему классу сборки? Скажите, что я хочу получить доступ к System.ComponentModel.Design.DesignerHost. Здесь DesignerHost является внутренним и закрытым классом.Как получить доступ к внутреннему классу с помощью Reflection

Как написать код для загрузки сборки и типа ?.

ответ

78

В общем, вы не должны не должны сделать это - если тип был отмечен как внутренний, это означает, что вы не собираетесь использовать его снаружи сборки. Его можно удалить, изменить и т. Д. В более поздней версии.

Однако отражение делает позволяет получить доступ типов и член, которые не являются открытым - просто посмотрите на перегрузки, которые занимают BindingFlags аргумент, и включают в себя BindingFlags.NonPublic в флагах, которые вы проходите.

Если у вас есть полное имя типа (включая информацию о сборке), то необходимо только позвонить Type.GetType(string). Если вы заранее знаете сборку и знаете публичный тип внутри этой сборки, то, используя typeof(TheOtherType).Assembly, чтобы получить ссылку на сборку, как правило, проще, вы можете позвонить Assembly.GetType(string).

+8

@dattebayo: только полный ответ Джона, обратите внимание, что код должен работать в полном доверии, или размышления о непубличных членах будут fail –

+1

Иногда вам просто нужно, пока он не сломается. У меня есть команда WPF 'DataGrid', параметром которой является' SelectedItems'. В команде параметр принимается как «объект», но это тип «SelectedCellCollection», который недоступен в моем коде. Мне нужен этот тип обмана в надежде направить параметр 'object' в' SelectedCellCollection'. – ProfK

9

Чтобы загрузить сборку и тип, вы процитировали в вашем примере:

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

Вы можете просто «Assembly.Load» («System.Design, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089») ' – abatishchev

+3

Если вам нужен только один тип, вы можете пропустить загрузку сборки явно:' var designHost = Тип .GetType ("System.ComponentModel.Design.DesignerHost, System.Design, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089"); ' –

Смежные вопросы