2017-02-12 89 views
0

我想将变量从一种形式传递给另一种形式。Activator.CreateInstance传递变量形式

这是在窗口2构造:

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

Activator只有在动态类型的环境中才有意义,在编译时不确定您要创建的对象是什么。 – Hristo

+0

您正试图调用Form2的构造函数,它带有两个参数。第一个是int类型的参数,第二个是字符串类型的参数。根据你提到的错误,你在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"}); 

但是,如果你知道哪些在编译时创建的实例类型,您应该简单地使用012创建对象:

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

@LuisVito,它真的解决了这个问题吗?因为你的代码适合我。 –

2

据我了解,你滥用Activator类。你应该使用的是'new'关键字来创建对象,因为你很清楚你将要创建的类型。

下面是它应该是什么样子:

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