2014-10-10 25 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(); 
} 
相关问题