在 C# 中通过字符串正确实例化 WinForm
Proper instatiating a WinForm via string in C#
我正在开发一个使用基础 window(例如 Form1)和许多其他 windows(例如 Form2、Form3 等)的 Winforms 应用程序。所有这些 windows 都将它们的 属性 TopLevel 设置为 false,没有边框,我在需要时将它们放在 Form1 中。我不够熟练或没有解决这个问题的脑容量:
public void ShowForm(string strNewForm) {
var frmNew = Activator.CreateInstance(Type.GetType(strNewForm)) as Form;
frmNew.TopLevel = false;
frmNew.Size = new Size(rctForm.Width, rctForm.Height);
frmNew.Location = new Point(rctForm.X, rctForm.Y);
frmNew.InitializeForm(strActualSection, strActualSubSection);
frmNew.Parent = this;
frmNew.Show();
}
strNewForm
变量包含要显示的 Form
的名称。每个 Form 中的所有方法和属性都可以使用,因为它们都是从基础 class Form
继承的。问题是 InitializeForm()
我在每种形式(Form2,Form3,...)中使用它来做各种事情。我知道我的问题出在这一行:
var frmNew = Activator.CreateInstance(Type.GetType(strNewForm)) as Form;
当 strNewForm
包含字符串“Form2”并且我将 as Form
更改为 as Form2
时它工作得很好。我知道每次都需要将其更改为正确的名称,但我不知道如何更改。我试着用这个:
Type frmType = Type.GetType(strNewForm);
var frmNew = Activator.CreateInstance(Type.GetType(strNewForm)) as frmType;
但是它抛出一个错误CS0118: frmType is a variable but is used as a type
。我不知道如何解决这个问题,我尝试了很多解决方案,我连续搜索了半天,但我仍然迷路了。任何见解都会非常有帮助。
您不能使用 run-time 变量来创建 strongly-typed 代码。
您必须在 as
之后提供 compile-time 类型。
如果你知道它是 Form
那么你所能做的就是:
var frmNew = Activator.CreateInstance(Type.GetType(strNewForm)) as Form;
如果您需要特定的方法或属性,请使用自定义 Form
作为您的 base-type 并在 as
.
中使用它
为什么不在 ShowForm
方法中传递 Form
对象?
public void ShowForm(Form newForm)
{
newForm.TopLevel = false;
newForm.Size = new Size(rctForm.Width, rctForm.Height);
newForm.Location = new Point(rctForm.X, rctForm.Y);
newForm.InitializeForm(strActualSection, strActualSubSection);
newForm.Parent = this;
newForm.ShowDialog();
}
我正在开发一个使用基础 window(例如 Form1)和许多其他 windows(例如 Form2、Form3 等)的 Winforms 应用程序。所有这些 windows 都将它们的 属性 TopLevel 设置为 false,没有边框,我在需要时将它们放在 Form1 中。我不够熟练或没有解决这个问题的脑容量:
public void ShowForm(string strNewForm) {
var frmNew = Activator.CreateInstance(Type.GetType(strNewForm)) as Form;
frmNew.TopLevel = false;
frmNew.Size = new Size(rctForm.Width, rctForm.Height);
frmNew.Location = new Point(rctForm.X, rctForm.Y);
frmNew.InitializeForm(strActualSection, strActualSubSection);
frmNew.Parent = this;
frmNew.Show();
}
strNewForm
变量包含要显示的 Form
的名称。每个 Form 中的所有方法和属性都可以使用,因为它们都是从基础 class Form
继承的。问题是 InitializeForm()
我在每种形式(Form2,Form3,...)中使用它来做各种事情。我知道我的问题出在这一行:
var frmNew = Activator.CreateInstance(Type.GetType(strNewForm)) as Form;
当 strNewForm
包含字符串“Form2”并且我将 as Form
更改为 as Form2
时它工作得很好。我知道每次都需要将其更改为正确的名称,但我不知道如何更改。我试着用这个:
Type frmType = Type.GetType(strNewForm);
var frmNew = Activator.CreateInstance(Type.GetType(strNewForm)) as frmType;
但是它抛出一个错误CS0118: frmType is a variable but is used as a type
。我不知道如何解决这个问题,我尝试了很多解决方案,我连续搜索了半天,但我仍然迷路了。任何见解都会非常有帮助。
您不能使用 run-time 变量来创建 strongly-typed 代码。
您必须在 as
之后提供 compile-time 类型。
如果你知道它是 Form
那么你所能做的就是:
var frmNew = Activator.CreateInstance(Type.GetType(strNewForm)) as Form;
如果您需要特定的方法或属性,请使用自定义 Form
作为您的 base-type 并在 as
.
为什么不在 ShowForm
方法中传递 Form
对象?
public void ShowForm(Form newForm)
{
newForm.TopLevel = false;
newForm.Size = new Size(rctForm.Width, rctForm.Height);
newForm.Location = new Point(rctForm.X, rctForm.Y);
newForm.InitializeForm(strActualSection, strActualSubSection);
newForm.Parent = this;
newForm.ShowDialog();
}