从我的项目中检索所有表单

时间:2014-10-10 16:57:30

标签: c# winforms

我知道之前已经问过这个问题。我有代码来做这个,但我收到一个错误,我想我知道为什么,但我真的进入.Net反思,所以我希望得到关于我是否正确的确认。

这是代码。我想从我的项目中检索基本类型为“BaseEditForm”的所有表单,然后检查以“EditForm”结尾的所有表单,我想将其放入List中以填充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不为null,而且如果emptyCtor为null,则无法使其达到此点。所以我对错误信息感到困惑。所以这是我的问题。为了正常工作,我的所有表单都必须有一个默认的构造函数?几乎所有表单都有一个带有一个或多个参数的构造函数。这是我的问题吗?

2 个答案:

答案 0 :(得分:0)

您的代码运作正常 它必须是抛出异常的构造函数之一。

检查所有派生的表单,看看它们中的任何一个(那些不带任何ctor参数的表单)是否会在调用时抛出NullReferenceException。

答案 1 :(得分:0)

我不确定为什么你会遇到尝试执行每个表单的构造函数的麻烦。您只需查看类型名称即可简化代码(并避免整个问题)。

public void LoadAllEditForms()
{
    Assembly project = Assembly.Load("UnionAdministrator");

    var formsList = project.GetTypes()
        .Where (t => t.BaseType == typeof(BaseEditForm) && t.Name.EndsWith("EditForm"))
        .ToList();
}