2017-02-12 5 views
0

Я хочу передать переменные из одной формы в другую.Activator.CreateInstance передать переменную в форму

Это конструктор в form2:

public Form2 (int getId,string getText) 

В Form1 я пытаюсь передать переменные как этот

var obj = (Form)Activator.CreateInstance(Type.GetType("myproject.Form2"),1,"test"); 
obj.ShowDialog(); 

я получаю сообщение об ошибке:

Additional information: Constructor on type 'myproject.Form2' not found.

Как могу ли я передать переменную?

+3

Есть ли [причина] (http: //meta.stackexchange.com/q/66377/147640), вы используете «Activator.CreateInstance» в первую очередь? – GSerg

+0

Активатор имеет смысл только в контексте динамических типов, когда вы не уверены во время компиляции, какой объект вы будете создавать. – Hristo

+0

Вы пытаетесь вызвать конструктор Form2, который принимает два параметра. Первый - это параметр типа int, а второй - параметр типа string. В соответствии с указанной вами ошибкой у вас нет такого конструктора в классе Form2. – Jacob

ответ

0

Вы должны бросить в Form2, не Form.

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

Вы можете попытаться передать аргументы как object[] (object массив) - CreateInstance(Type type, object[] args), но и вы можете передать аргументы, как вы пройти их (потому что метод принимает params object[] args).

Попробуйте заменить эту строку:

var obj = (Form)Activator.CreateInstance(Type.GetType("myproject.Form2"),1,"test"); 

этим:

var obj = 
    (Form2)Activator.CreateInstance(Type.GetType("myproject.Form2"), new object[] {1, "test"}); 

Кроме того, вы можете использовать typeof, чтобы получить Type экземпляр:

var obj = (Form2)Activator.CreateInstance(typeof(Form2), new object[] {1, "test"}); 

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

var obj = new Form2(1, "test"); 
+0

@ LuisVito, это действительно решило проблему? Потому что ваш код работает на меня. –

2

Насколько я понимаю, вы злоупотребляете классом Activator. То, что вы действительно должны использовать, - это «новое» ключевое слово для создания объекта, поскольку вы хорошо знаете тип, который будете создавать.

Вот как это должно выглядеть:

var obj = new Form2(1,"test"); 

Использование класса Activator только имеет смысл, если вы не знаете, что тот тип, который вы будете создавать действительно.

2

Почему бы вам просто не создать экземпляр формы без использования отражения?

Form2 frm2 = new Form2(1, "test"); 
frm2.ShowDialog(); 

Если вы хотите использовать рефлексию по какой-то причине должны работать при условии, что ваш код, что Form2 класс определен в «MyProject» пространства имен в одной и той же сборки.

namespace myproject 
{ 
    public class Form2 : Form 
    { 
     public Form2 (int getId, string getText) 
     { 
      InitializeComponent(); 
     } 
    } 
} 

Если он определен в другой сборке, вы должны прочитать:

Resolve Type from Class Name in a Different Assembly

Смежные вопросы