2009-08-11 6 views

Répondre

78

En général, vous ne devrait pas faire cela - si un type a été marqué interne, cela signifie que vous n'êtes pas destiné à l'utiliser de l'extérieur de l'ensemble. Il pourrait être enlevé, changé etc. dans une version ultérieure.

Cependant, la réflexion ne vous permettent d'accéder à des types et des membres qui ne sont pas publics - il suffit de regarder pour qui prennent les surcharges arguments BindingFlags et comprennent BindingFlags.NonPublic dans les drapeaux que vous passez.

Si vous avez le qualifié complet le nom du type (y compris les informations d'assemblage) alors il suffit d'appeler Type.GetType(string) devrait fonctionner. Si vous connaissez l'assembly à l'avance et que vous connaissez un type public dans cet assembly, l'utilisation de typeof(TheOtherType).Assembly pour obtenir la référence d'assembly est généralement plus simple, vous pouvez alors appeler Assembly.GetType(string).

+8

@dattebayo: juste pour compléter la réponse de Jon, notez que votre code doit exécuter en toute confiance, ou la réflexion sur les membres non publiques seront échouer –

+1

Parfois, il suffit de le faire, jusqu'à ce qu'il se brise. J'ai une commande 'DataGrid' de WPF dont le paramètre est' SelectedItems'. Dans la commande, le paramètre est reçu en tant que 'object' mais il est de type' SelectedCellCollection', ce qui est inaccessible dans mon code. J'ai besoin de ce type de triche dans l'espoir de transformer le paramètre 'object' en' SelectedCellCollection'. – ProfK

9

Pour charger l'assemblage et le type que vous avez cité dans votre exemple:

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

Vous pouvez simplement 'Assembly.Load (" System.Design, Version = 4.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089 ")' – abatishchev

+3

Si vous avez seulement besoin d'un type, vous pouvez passer le chargement de l'assembly explicitement: 'var designHost = Type .GetType ("System.ComponentModel.Design.DesignerHost, System.Design, Version = 4.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089") –

Questions connexes