74 votes

Créer une instance d'objet sans invoquer le constructeur ?

En C#, existe-t-il un moyen d'instancier une instance d'une classe sans invoquer son constructeur ?

Supposons que la classe soit publique et définie dans une bibliothèque tierce et que le constructeur soit interne. Les raisons pour lesquelles je veux faire cela sont compliquées mais il serait utile de savoir si c'est possible en utilisant une sorte de hacking C#.

NOTE : J'ai spécifiquement ne veulent pas appeler de constructeur Il n'est donc pas possible d'utiliser la réflexion pour accéder au constructeur interne.

-1voto

Cybis Points 5062

Voir la fonction System.Activator.CreateInstance.

-1voto

Kennet Belenky Points 2026

Ce que vous demandez est une violation de la philosophie sur laquelle la programmation gérée a été développée. Le cadre .Net et le langage C# ont été conçus en partant du principe que, dans la mesure du possible, les objets doivent être dissociés de leur mémoire sous-jacente. Les objets sont des objets, pas un tableau structuré d'octets. C'est la raison pour laquelle vous ne pouvez pas transformer les objets en pointeurs void à tort et à travers. Lorsque les objets sont abstraits de leur mémoire sous-jacente, il est fondamentalement invalide de suggérer qu'une instance d'objet peut exister sans que le constructeur soit invoqué.

Cela dit, le cadre .Net a fait des concessions au fait qu'en réalité, les objets sont représentés dans la mémoire. Avec un peu de créativité, il est possible d'instancier des types de valeurs sans invoquer leurs initialisateurs. Toutefois, si vous estimez devoir le faire, c'est que vous vous y prenez mal.

-1voto

J'ai remarqué que le sujet était "mort", mais j'ai voulu clarifier la situation pour les autres lecteurs et donner une réponse finale qui n'était peut-être pas possible au moment où la question a été posée. Voici donc la réponse.

Il semble que l'on puisse instancier une classe sans utiliser ses constructeurs en attribuant des valeurs à ses propriétés. Voici l'adresse où se trouve le how-to dans MSDN pour ce type d'instanciation http://msdn.microsoft.com/en-us/library/bb397680.aspx .

Il semble que cette technique ne soit pas très connue car je l'ai rencontrée dans un article de CodeProject, puis je l'ai cherchée sur Google et je n'ai rien trouvé à ce sujet. Plus tard, j'ai visité la page d'accueil de MSDN et il y avait un article qui me renvoyait exactement à ce sujet. Il semble donc qu'il s'agisse d'un sujet inconnu plutôt que nouveau, car la date de l'article de CodeProject est mai 2008.

J'espère que cela aidera quelqu'un d'autre qui cherche sur Google et qui se trouve confronté à cette question.

-3voto

James Curran Points 55356

Personne ici n'a vraiment clarifié ce que l'on entend par "c'est impossible".

Le constructeur es ce qui crée l'objet. Votre question s'apparente à "Comment puis-je construire un château de sable sans lui donner la forme d'un château ?". Vous ne pouvez pas. Tout ce que vous obtiendrez, c'est un tas de sable.

La chose la plus proche que vous puissiez faire est d'allouer un bloc de mémoire de la même taille que votre objet :

byte[] fakeObject = new byte[sizeof(myStruct)];

(NOTE : même cela ne fonctionnera que si MyStruct est un type de valeur)

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