在 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();  
}