66 votes

Instanciation d'une classe avec un constructeur interne

J'ai une classe dont le constructeur est défini comme interne, ce qui signifie que je ne peut pas instancier. Bien que cela peut faire sens, je voudrais encore faire une fois pour le débogage et de la recherche.

Est-il possible de le faire avec Réflexion? Je sais que je peux accès Privé/Membres Internes, mais puis-je appeler un interne constructeur?

Ou, comme le constructeur n'a rien d'important, puis-je utiliser la réflexion pour dire "Regardez, il suffit de me donner une instance de la classe sans appeler le constructeur, je vais le faire, c'est le travail à la main"?

La Performance et la "Stabilité" n'est pas un problème ici, ce n'est pas le code de production.

Edit: Juste pour clarifier: Malheureusement, je n'ai pas le contrôle de l'autre assemblée et qui n'ont pas c'est le code source, je me contente d'essayer de comprendre comment il fonctionne comme la documentation est à côté de la non-existant, mais je suis censé interface avec elle.

104voto

Philippe Leybaert Points 62715

Une alternative serait de nommer la convocation de l'assemblée comme un "ami" de l'assemblée.

Simplement ajouter ceci à AssemblyInfo.cs fichier de l'assemblage contenant l'interne constructeur:

[assembly: InternalsVisibleTo("Calling.Assembly")]


Si vous n'avez pas accès à l'assemblée, vous pouvez également appeler le constructeur directement (à l'aide de la Réflexion):

MyClass obj = (MyClass) typeof(MyClass).GetConstructor(
                  BindingFlags.NonPublic | BindingFlags.Instance,
                  null, Type.EmptyTypes, null).Invoke(null);

33voto

Kenan E. K. Points 8497

Un FormatterServices.GetUninitializedObject méthode existe (espace de Noms: System.Moment de l'exécution.La sérialisation), il paraît appelle pas les constructeurs, si vous voulez vraiment essayer cette approche.

3voto

Michael McCloskey Points 1765

J'ai vécu cette même situation a tout à l'arrière et a créé un petit utilitaire que j'ai appelé "InternalsVisibleToInjector". Il utilise ILDASM et ILASM de démonter, de modifier, et de le remonter et de l'assemblée avec le nom de l'assemblage de ma sélection ajoutés à la InternalsVisibleTo liste pour la cible de l'assemblée. Il marchait très bien dans ma situation.

J'ai posté le code source (VS 2008, C# WinForm) pour l'utilitaire ici:

http://www.schematrix.com/downloads/InternalsVisibleToInjector.zip

Cela peut ne pas fonctionner si l'assemblée est signée. Veuillez prendre toutes les précautions appropriées (c'est à dire faire une copie de sauvegarde de l'assemblée avant d'utiliser ce et vous assurer que vous êtes sur les bases juridiques, etc.)

1voto

Peter Lillevold Points 20689

Vous pouvez utiliser un Réflecteur pour analyser son code source et que de comprendre le fonctionnement interne.

0voto

Brian Rasmussen Points 68853

internal ne signifie pas que vous ne pouvez pas l'instancier. Cela signifie simplement que seuls les membres de la même assemblée peut l'appeler.

À des fins de test, vous pouvez permettre à votre montage d'essai pour l'accès internes ainsi à l'aide de la InternalsVisibleTo attribut. Voir http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx

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