64 votes

Comment accéder à une classe interne à l'aide de Reflection

Comment puis-je accéder à une classe interne d'un assemblage ? Disons que je veux accéder à System.ComponentModel.Design.DesignerHost. Ici le DesignerHost est une classe interne et scellée.

Comment puis-je écrire un code pour charger l'assemblage et le type ?

101voto

Jon Skeet Points 692016

En général, vous ne devrait pas Si un type a été marqué comme interne, cela signifie que vous n'êtes pas censé l'utiliser en dehors de l'assemblage. Il pourrait être supprimé, modifié, etc. dans une version ultérieure.

Cependant, la réflexion fait vous permettent d'accéder à des types et à des membres qui ne sont pas publics - il suffit de rechercher les surcharges qui prennent un fichier BindingFlags et inclure l'argument BindingFlags.NonPublic dans les drapeaux que vous passez.

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

14voto

Patrick McDonald Points 20645

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");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X