Я знаю, что этот вопрос задан раньше. У меня есть код, чтобы сделать это, но я получаю сообщение об ошибке, и я думаю, что знаю, почему, но я просто действительно попадаю в .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, чтобы добраться до этой точки, если она равна нулю. Поэтому я смущен сообщением об ошибке. Вот мой вопрос. Чтобы это правильно работало, все мои формы должны иметь конструктор по умолчанию? Почти у всех моих форм есть конструктор, который принимает один или несколько параметров. Это моя проблема?
Возможно, это литой '(Form)'. Попробуйте сделать 'emptyCtor.Invoke (новый объект [] {}) как Form', а check' f' для null –
. Не сомневайтесь, что вы указали правильную строку, когда ваш код содержит try/catch. Окно сообщений, которое вы покажете, также будет очень бесполезным, оно ничего не скажет. Действительно ли это * выглядит так или вы правильно отображаете InnerException? –