您好,我想找到解决问题的方法,我发现.net Activator.CreateInstance提供了一种方法,但我现在真的不明白为什么它对我不起作用。
public Form1()
{
InitializeComponent();
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFormInPanel(object name_of_form,Control panel....,);
}
private void OpenFormInPanel(object name_of_form,Control panel....,)
{
var objForm = (Form)Activator.CreateInstance(Type.GetType("WindowsFormsApp12.Form2"), 1, "test");
// Form2 objForm = new Form2();
// Form objForm = (Form)handle.Unwrap();
//ObjectHandle objForm = Activator.CreateInstance("Namespace.Forms", "Form2");
objForm.TopLevel = false;
panel1.Controls.Add(objForm);
objForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
objForm.Dock = DockStyle.Fill;
objForm.Show();
}
这是Form2
namespace WindowsFormsApp12
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
}
}
非常感谢您的每一次帮助。
答案 0 :(得分:2)
Activator.CreateInstance
是一种使用Type
创建类实例的方法。如果您确切地知道需要创建哪种类型,则可能没有理由使用它。
您可以这样做:
var objForm = new Form2();
CreateInstance
实际上只是在做同样的事情-它在调用构造函数。
overload you're calling将采用其他参数,并尝试将其传递给构造函数。所以这个:
var objForm = (Form)Activator.CreateInstance(Type.GetType("WindowsFormsApp12.Form2"), 1, "test");
基本上与此相同:
var objForm = new Form2(1, "test");
如果您尝试在应用程序中键入该内容,则可能会看到编译错误,因为Form2
没有采用整数和字符串(1, "test")
的构造函数。这可能就是为什么它失败了。它正在尝试调用不存在的构造函数。
在我键入此详细信息时,已在注释中添加了
System.MissingMethodException:找不到WindowsFormsApp12.Form2构造函数
如果转到该方法的链接(在上面链接),它将告诉您它可能引发的不同异常以及原因。
它说:
MissingMethodException
在用于Windows Store应用程序的.NET或可移植类库中,捕获基类异常MissingMemberException。
未找到匹配的公共构造函数。
就是这样。它正在尝试调用一个接受整数和字符串但该类没有一个的构造函数。
除非您确实需要使用Activator.CreateInstance
,否则我不会尝试修正其使用方式。我只是将构造函数称为“常规”方法。或者也许从此开始,使其工作,然后如果需要CreateInstance
,则在知道要调用的构造函数后将其改回原来的状态。
这是许多开发人员不使用的便捷工具。如果要在.NET Framework中调用类的方法,并且它抛出异常并且不知道为什么,或者想知道它可能引发什么异常,则可以转到该方法及其相关文档通常会告诉您它引发什么异常以及原因。通常,您只需突出显示代码中的方法,然后按F1键即可。