2010-11-08 5 views
0

возможно ли создавать экземпляры класса программно?C# создание экземпляров классов программно

, например, мне нужно будет создать в любом из 10-20 форм программно

так что я буду делать:

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

однако конструкторы будут каждый раз разный, поэтому мне нужно поставить это в петле цикла

поэтому мне нужно будет запустить приведенный выше код, сколько раз мне нужно. например, 10-20 раз. Мне нужно будет иметь формы классов graphs1, graphs2, graph33 ...

это возможно?

+2

Вы можете использовать отражение. См. Раздел Activator.CreateInstance. Но если вы действительно хотите, это еще один вопрос. Похоже, что ваша конкретная проблема является симптомом архитектурной проблемы. http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx – CodesInChaos

+0

Вы просто пытаетесь избежать требуемой типизации или есть еще одна общая проблема, которую вы пытаетесь решить? Являются ли эти классы неизвестными во время компиляции? – Mark

+0

Вы хотите создать много форм и каждый раз вызывать разные конструкторы? Используйте for-loop и if-else. Я не вижу проблемы. – Qwertie

ответ

4

Не уверен, если я это правильно понял, но вы после этого?

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

будет ли это работать? что это делает? –

+0

Да, это будет работать, если вы сможете выяснить, какое значение передать в каждом цикле цикла, основанное на значении i. – Aliostad

+0

так как я могу назвать форму.Показать() метод с этим? –

1

Вы можете испускать новые классы во время выполнения, конечно, но я подозреваю, что вы задаете неправильный вопрос здесь. Если вам нужно только добавить случайные элементы управления в форму, просто создайте новый объект Form и добавьте эти элементы управления. Если вам действительно нужно создавать новые классы во время выполнения, посмотрите на пространство имен System.Reflection.Emit.

Если вы считаете, что это смутный ответ, вам следует рассмотреть вопрос о менее расплывчатом вопросе. ;)

4

Я бы порекомендовал вам заглянуть в шаблон фабричного дизайна. Есть много вариантов, в зависимости от того, чего вы пытаетесь достичь.

Вы могли бы найти это полезным: http://www.dofactory.com/Patterns/Patterns.aspx

+0

+1: но IMHO «абстрактный завод» был бы рекомендованным здесь. – rsenna

0

Используйте класс Activator обеспечивается структурой:

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

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

    }