271 votes

Créer une instance d'une classe à partir d'une chaîne de caractères

Existe-t-il un moyen de créer une instance d'une classe à partir du fait que je connais le nom de la classe au moment de l'exécution ? En fait, j'aurais le nom de la classe dans une chaîne de caractères.

0 votes

Vous semblez avoir décrit la solution que vous voulez mettre en œuvre, mais pas le problème que vous essayez de résoudre. Peut-être que vous essayez de faire quelque chose avec l'extensibilité, auquel cas je vous suggère de consulter l'outil Cadre d'extensibilité géré .

182voto

Matt Hamilton Points 98268

Jetez un coup d'œil à la Activator.CreateInstance méthode.

16 votes

Relié à de grands exemples : stackoverflow.com/questions/493490/

0 votes

Ce post sera également pertinent, car votre type doit être trouvé : stackoverflow.com/questions/1825147/

1 votes

58voto

Raymond Li Points 1134

J'ai utilisé cette méthode avec succès :

System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)

Vous devrez convertir l'objet retourné en votre type d'objet souhaité.

13 votes

J'essaie d'imaginer un scénario dans lequel la création de l'objet par le nom de la classe, puis le moulage en tant que ce type, aurait un sens.

14 votes

Je vois ce que vous voulez dire. Cela semble redondant. Si vous connaissez le nom de la classe, pourquoi avez-vous besoin de la chaîne dynamique ? Une situation pourrait être que votre casting vers une classe de base et la chaîne représente les descendants de cette classe de base.

4 votes

Si la classe de base est connue, vous pouvez utiliser la classe de base ou une interface de celle-ci comme argument pour passer les descendants sans réflexion.

27voto

PeteT Points 5277

Ma question aurait probablement dû être plus précise. En fait, je connais une classe de base pour la chaîne de caractères et j'ai donc résolu le problème :

ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));

La classe Activator.CreateInstance possède plusieurs méthodes pour réaliser la même chose de différentes manières. J'aurais pu le transformer en objet, mais la méthode ci-dessus est la plus utile dans ma situation.

4 votes

Au lieu de répondre dans la section des questions, je vous suggère de modifier votre question et de noter les changements. Vous obtiendrez plus de réponses et de meilleures réponses en le faisant.

0 votes

Merci de poster la ligne de code spécifique qui a fonctionné pour vous. Le tri de toutes les surcharges de CreateInstance et des différentes façons de générer des types me prenait beaucoup de temps, ce que vous m'avez fait gagner.

4voto

Denny Points 36

Je sais que je suis en retard... mais la solution que vous recherchez pourrait être la combinaison de ce qui précède et l'utilisation d'une interface pour définir les aspects accessibles au public de vos objets.

Ensuite, si toutes les classes générées de cette manière implémentent cette interface, vous pouvez simplement effectuer un cast en tant que type d'interface et travailler avec l'objet résultant.

3voto

Jay Bazuzi Points 20462

Vous semblez avoir décrit la solution que vous voulez mettre en œuvre, mais pas le problème que vous essayez de résoudre.

Peut-être que vous essayez de faire quelque chose avec l'extensibilité, dans ce cas je vous suggère de consulter le site de la Cadre d'extensibilité géré .

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