2010-11-08 7 views
0

est-il possible de créer des instances d'une classe par programmation?C# créer des instances de classes par programme

par exemple, je dois créer partout de 10-20 formes par programme

donc je ferai:

Form graphs = new Form1(dateStart.Value.ToShortDateString(), dateEnd.Value.ToShortDateString(),cbQCValues.Text,cbAnalytes.Text,cbInstruments.Text); 

mais les constructeurs vont être différents à chaque fois que je dois donc mettre cela dans une boucle for

alors je vais devoir exécuter le code ci-dessus combien de fois j'ai besoin de. par exemple 10-20 fois. Je devrai avoir des classes de formes graphiques1, graphiques2, graphiques3 ...

est-ce possible?

+2

Vous pouvez utiliser la réflexion. Voir Activator.CreateInstance. Mais si vous voulez vraiment, c'est une autre question. C'est comme si votre problème concret était le symptôme d'un problème architectural. http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx – CodesInChaos

+0

Etes-vous simplement en train d'essayer d'éviter la saisie requise ou y a-t-il un autre problème plus général que vous essayez de résoudre? Ces classes sont-elles inconnues au moment de la compilation? – Mark

+0

Vous souhaitez créer plusieurs formulaires et appeler un constructeur différent à chaque fois? Utilisez un for-loop et if-else. Je ne vois pas le problème. – Qwertie

Répondre

4

Je ne sais pas si je comprends bien, mais êtes-vous après cela ??

List<Form1> forms = new List<Form1>(); 
for(int i=0;i<20;i++) 
{ 
    forms.Add(new Form1(, ......)) 
} 
+0

cela fonctionnera-t-il? qu'est-ce que ça fait? –

+0

Oui, cela fonctionnera si vous pouvez déterminer quelle valeur passer dans chaque cycle de boucle en fonction de la valeur de i. – Aliostad

+0

alors comment j'appellerais la méthode form.Show() avec ça? –

1

Vous pouvez émettre de nouvelles classes lors de l'exécution, bien sûr, mais je suppose que vous posez la mauvaise question ici. Si vous avez seulement besoin d'ajouter des contrôles aléatoires à un formulaire, créez simplement un nouvel objet Form et ajoutez ces contrôles. Si vous avez vraiment besoin de créer de nouvelles classes lors de l'exécution, jetez un oeil à l'espace de noms System.Reflection.Emit.

Si vous pensez que c'est une réponse vague, vous devriez envisager d'écrire une question moins vague. ;)

4

Je vous recommande de regarder dans un modèle de conception d'usine. Il y a beaucoup d'options, selon ce que vous essayez d'accomplir.

Vous pourriez trouver ce utile: http://www.dofactory.com/Patterns/Patterns.aspx

+0

+1: mais à mon humble avis une "usine abstraite" serait l'option recommandée ici. – rsenna

0

Utilisez la classe Activator fournie par le cadre:

public T CreateInstance<T>() where T: new() { 

    return (T)Activator.CreateInstane(Assembly.GetEntryAssembly().CodeBase, 
            typeof(SomeType).FullName) 

    } 
Questions connexes