从该表单中获取实例化表单的类型



我有一个WinForms应用程序,它有两个不同类型的对象和一个通用的表单。

Public Class A:
{
   private MyForm formA = new MyForm();
   public void ShowForm()
   {
      formA.ShowDialog();
   }
}
Public Class B:
{
   private MyForm formB = new MyForm();
   public void ShowForm()
   {
      formB.ShowDialog();
   }
}
Public class MyForm : Form
{
}

是否有一种方法来反思性地告诉什么类是从MyForm类中显示MyForm ?

不完全是这样,如果不遍历跟踪的话,这充其量是一种hack。

改变你的表单构造函数,接受一个Type参数,并让父类传递它自己的类型:

new MyForm(typeof(B));

是的,有,但是这是一个hack,你不应该这样做!

也就是说,你可以通过StackTrace类来做到这一点:

StackTrace stackTrace = new StackTrace();
if (stackTrace.GetFrame(1).GetMethod().DeclaringType.Name == "A")
{
    // Class A called us
}

我们要求堆栈跟踪第一个堆栈帧(第0个堆栈帧是当前的堆栈帧),因为我们在调用该方法的方法之后。您可以使用GetMethod调用返回的MethodBase实例的其他属性来查找其他信息,例如方法名称。

更好的方法是修改构造函数以接受额外的参数来修改表单的行为。这些参数应该封装表单的行为,例如,您可能希望传递一个布尔标志,指示是否禁用某些控件,或者一个文本字段来自定义表单标题。

你不应该让表单根据调用者改变它的行为,因为这会使在其他情况下重用表单变得更加困难。

您可以为MyForm添加一个属性,在该属性中设置包含类型。

如果您是从某种控件显示表单,调用ShowDialog,将调用控件作为所有者参数传递:

formA.ShowDialog(this);

然后在MyForm类中,你可以检查Owner属性,看看是谁调用了它,并获得调用者的类型

Owner.GetType();

最新更新