我知道这个问题之前已被问过。我有代码来做到这一点,但我得到了一个错误,我想我知道为什么,但我只是真的进入.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,则无法达到此点。所以我对这个错误信息感到困惑。所以这是我的问题。为了这个正常工作,我所有的表单都必须有一个默认的构造函数?几乎所有的表单都有一个带有一个或多个参数的构造函数。这是我的问题吗?
也许是铸造'(表格)'。尝试做一个'emptyCtor.Invoke(new object [] {})作为Form'并检查'f'为null – 2014-10-10 17:13:21
有点怀疑你在代码中包含try/catch时是否确定了正确的行。你显示的消息框也将非常无益,它不会说任何有用的东西。它实际上*看起来像那样,还是你正确地显示了InnerException? – 2014-10-10 18:43:20