Я знаю, что этот вопрос задавали раньше. У меня есть код, чтобы сделать это, но я получаю сообщение об ошибке, и я думаю, что знаю, почему, но я просто действительно попадаю в.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 мог получить эту точку, если она равна нулю. Поэтому я смущен сообщением об ошибке. Вот мой вопрос. Чтобы это правильно работало, все мои формы должны иметь конструктор по умолчанию? Почти у всех моих форм есть конструктор, который принимает один или несколько параметров. Это моя проблема?
Ваш код работает нормально.
Это должен быть один из ваших конструкторов, который генерирует исключение.
Проверьте все ваши производные формы, чтобы узнать, может ли кто-либо из них (те, которые не принимают какие-либо параметры ctor), вызывать исключение NullReferenceException при вызове.
Я не знаю, почему вы пытаетесь выполнить конструктор каждой формы. Вы можете упростить свой код (и избежать всей проблемы), просто взглянув на имена типов.
public void LoadAllEditForms()
{
Assembly project = Assembly.Load("UnionAdministrator");
var formsList = project.GetTypes()
.Where (t => t.BaseType == typeof(BaseEditForm) && t.Name.EndsWith("EditForm"))
.ToList();
}
(Form)
. Попробуйте сделатьemptyCtor.Invoke(new object[] {}) as Form
и проверитьf
на null