我有一个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();