web-dev-qa-db-fra.com

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

Comment accéder à une classe interne d'un assembly? Supposons que je souhaite 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'assembly et le type?.

62
dattebayo

En général, vous ne devriez pas faire cela - si un type a été marqué en interne, cela signifie que vous n'êtes pas censé l'utiliser depuis l'extérieur de l'assembly . Il pourrait être supprimé, modifié, etc. dans une version ultérieure.

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

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

96
Jon Skeet

Pour charger l'assemblage et taper 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");
14
Patrick McDonald