2014-10-10 22 views
1

我知道這個問題之前已被問過。我有代碼來做到這一點,但我得到了一個錯誤,我想我知道爲什麼,但我只是真的進入.Net反射,所以我想確認我是否正確。從我的項目中檢索所有表格

這是代碼。我想從我的項目中檢索所有基本類型爲「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爲null,則無法達到此點。所以我對這個錯誤信息感到困惑。所以這是我的問題。爲了這個正常工作,我所有的表單都必須有一個默認的構造函數?幾乎所有的表單都有一個帶有一個或多個參數的構造函數。這是我的問題嗎?

+0

也許是鑄造'(表格)'。嘗試做一個'emptyCtor.Invoke(new object [] {})作爲Form'並檢查'f'爲null – 2014-10-10 17:13:21

+0

有點懷疑你在代碼中包含try/catch時是否確定了正確的行。你顯示的消息框也將非常無益,它不會說任何有用的東西。它實際上*看起來像那樣,還是你正確地顯示了InnerException? – 2014-10-10 18:43:20

回答

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(); 
} 
相關問題