получение всех форм из моего проекта

1

Я знаю, что этот вопрос задавали раньше. У меня есть код, чтобы сделать это, но я получаю сообщение об ошибке, и я думаю, что знаю, почему, но я просто действительно попадаю в.Net Reflection, поэтому я хочу получить подтверждение о том, верен я или нет.

Вот код. Я хочу получить все формы из моего проекта, которые имеют базовый тип "BaseEditForm", а затем все те, которые заканчиваются "EditForm", я хочу добавить список, чтобы заполнить ListBox.

public void LoadAllEditForms()
        {
            formsList = new List<string>();

            try
            {
                Assembly project = Assembly.Load("UnionAdministrator");

                foreach (Type t in project.GetTypes())
                {
                    if (t.BaseType == typeof (BaseEditForm))
                    {
                        var emptyCtor = t.GetConstructor(Type.EmptyTypes);
                        if (emptyCtor != null)
                        {
                            var f = (Form) emptyCtor.Invoke(new object[] {});
                            if (f.Name.EndsWith("EditForm"))
                                formsList.Add(f.Name);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

Я получаю сообщение об ошибке "Ссылка на объект не установлена в экземпляр объекта". на линии

var f = (Form) emptyCtor.Invoke(new object[] {});

emptyCtor не является нулевым, и, кроме того, нет пути для того, чтобы emptyCtor мог получить эту точку, если она равна нулю. Поэтому я смущен сообщением об ошибке. Вот мой вопрос. Чтобы это правильно работало, все мои формы должны иметь конструктор по умолчанию? Почти у всех моих форм есть конструктор, который принимает один или несколько параметров. Это моя проблема?

  • 0
    Возможно, это актерский состав (Form) . Попробуйте сделать emptyCtor.Invoke(new object[] {}) as Form и проверить f на null
  • 0
    Вроде сомнительно, что вы определили правильную строку, когда ваш код содержит try / catch. Окно сообщения, которое вы показываете, также будет очень бесполезным, оно не скажет ничего полезного. Это на самом деле выглядит так или вы правильно отображаете InnerException?
Теги:
winforms

2 ответа

0

Ваш код работает нормально.
Это должен быть один из ваших конструкторов, который генерирует исключение.

Проверьте все ваши производные формы, чтобы узнать, может ли кто-либо из них (те, которые не принимают какие-либо параметры ctor), вызывать исключение NullReferenceException при вызове.

0

Я не знаю, почему вы пытаетесь выполнить конструктор каждой формы. Вы можете упростить свой код (и избежать всей проблемы), просто взглянув на имена типов.

public void LoadAllEditForms()
{
    Assembly project = Assembly.Load("UnionAdministrator");

    var formsList = project.GetTypes()
        .Where (t => t.BaseType == typeof(BaseEditForm) && t.Name.EndsWith("EditForm"))
        .ToList();
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню