2014-10-10 2 views
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 (новый объект [] {}) как Form', а check' f' для null –

+0

. Не сомневайтесь, что вы указали правильную строку, когда ваш код содержит try/catch. Окно сообщений, которое вы покажете, также будет очень бесполезным, оно ничего не скажет. Действительно ли это * выглядит так или вы правильно отображаете InnerException? –

ответ

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(); 
} 
Смежные вопросы