2009-12-11 4 views
0

Si l'une d'entre elles avait une classe telle que 'Painter' et que l'une d'entre elles devait être capable de créer une instance ou des instances de class @ runtime, quelle est la meilleure façon de procéder?C# demande à l'utilisateur de créer une instance de classe

Donc, chaque fois qu'un utilisateur clique sur un bouton, nous avons besoin d'un nouvel objet peintre?

Ou chaque fois que l'utilisateur entre dans 'nouveau peintre' nous avons besoin d'une nouvelle instance de peintre?

+0

Toutes les instances d'objet sont créées lors de l'exécution en appelant le constructeur de type. Vous devez élaborer un peu plus votre question. Essayez-vous de laisser l'utilisateur taper du code C# qui sera évalué dynamiquement? –

Répondre

5

Vous pouvez obtenir un Type d'un string en utilisant Type.GetType.

Une fois que vous avez un objet Type, vous pouvez appeler Activator.CreateInstance pour l'instancier ou appeler le Type.GetConstructors, choisir un constructeur approprié, puis l'appeler.

Deux « gotchas » à propos Type.GetType, par la voie:

  • Vous devez inclure l'espace de noms dans le nom du type
  • À moins que le type est dans l'assemblage ou mscorlib en cours d'exécution, vous devez spécifier le nom de l'assemblage ainsi avec les informations de version si elle est un nom fort

Si vous avez une référence à l'assemblée en question, puis Assembly.GetType peut être une approche plus simple - vous devez toujours inclure l'espace de noms.

+0

"informations de version si elle est fortement typée" aurait dû être "informations de version si elle est fortement nommé" –

+0

@AZ: Merci, corrigeant maintenant. –

3

Je suppose que l'essentiel de votre question est que le type de classe est inconnu avant la saisie de l'utilisateur. Sinon, si vous vouliez une nouvelle classe Painter à chaque clic sur un bouton, vous pouvez simplement gérer le clic du bouton et faire "var newpainter = new Painter();". Donc, en supposant que vous ayez besoin de créer dynamiquement une instance d'un type inconnu, vous pouvez utiliser la réflexion pour le faire lors de l'exécution.

var newpainter = Activator.CreateInstance(Type.GetType("Painter"), args); 
Questions connexes