Получить тип, который создает экземпляр формы, из этой формы - PullRequest
0 голосов
/ 15 июля 2011

У меня есть приложение WinForms, которое, например, имеет 2 различных типа объектов и одну общую форму.

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?

Ответы [ 4 ]

3 голосов
/ 15 июля 2011

Не совсем, ну, не без обхода трассировки, которая в лучшем случае является хаком.

Измените конструктор формы, чтобы он принял параметр Type, и чтобы родительский класс передавал свой собственный тип:

new MyForm(typeof(B));

1 голос
/ 15 июля 2011

Да, но это взлом, и вы не должны этого делать!

Тем не менее, вы можете сделать это через класс StackTrace:

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

Мы запрашиваем трассировку стека для первого кадра стека (0-й кадр стека является текущим), потому что мы следуем за методом, вызвавшим этот метод. Вы можете использовать другие свойства экземпляра MethodBase, возвращаемого вызовом GetMethod, чтобы найти другую информацию, такую ​​как имя метода.

гораздо лучший способ сделать это - вместо этого модифицировать конструктор, чтобы принимать дополнительные аргументы для изменения поведения формы. Эти аргументы должны инкапсулировать поведение формы , например, вы можете передать логический флаг, указывающий, отключены ли определенные элементы управления, или текстовое поле для настройки заголовка формы.

Вы не должны заставлять форму изменять свое поведение в зависимости от вызывающей стороны, поскольку это затрудняет повторное использование формы в других ситуациях.

0 голосов
/ 15 июля 2011

Если вы показываете форму из какого-либо элемента управления, вызовите ShowDialog, передавая вызывающий элемент управления в качестве параметра владельца:

formA.ShowDialog(this);

Затем в классе MyForm вы можете проверить свойство Owner, чтобы узнать, кто его вызвал, и получить тип вызывающей стороны

Owner.GetType();
0 голосов
/ 15 июля 2011

Вы можете добавить свойство к MyForm, в котором установлен содержащий тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...