我知道之前已经问过这个问题。我有代码来做这个,但我收到一个错误,我想我知道为什么,但我真的进入.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,则无法使其达到此点。所以我对错误信息感到困惑。所以这是我的问题。为了正常工作,我的所有表单都必须有一个默认的构造函数?几乎所有表单都有一个带有一个或多个参数的构造函数。这是我的问题吗?
答案 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();
}