该函数将加载一个程序集,让用户从列表中选择一个表单,然后尝试调用它。如果成功,则返回表单。如何向构造函数提供参数,事先不知道?
我的问题是如何实例化具有预期类型的参数的构造函数。 如果构造函数期望List<string>
应该提供一个空的List<String>
,而不仅仅是null。
什么想法?
private Form SelectForm(string fileName)
{
Assembly assembly = Assembly.LoadFrom(fileName);
var asmTypes = assembly.GetTypes().Where(F => F.IsSubclassOf(typeof(Form)));
string SelectedFormName;
using (FrmSelectForm form = new FrmSelectForm())
{
form.DataSource = (from row in asmTypes
select new { row.Name, row.Namespace, row.BaseType }).ToList();
if (form.ShowDialog(this) != DialogResult.OK)
return null;
SelectedFormName = form.SelectedForm;
}
Type t = asmTypes.Single<Type>(F => F.Name == SelectedFormName);
foreach (var ctor in t.GetConstructors())
{
try
{
object[] parameters = new object[ctor.GetParameters().Length];
for (int i = 0; i < ctor.GetParameters().Length; i++)
{
parameters[i] = ctor.GetParameters()[i].DefaultValue;
}
return Activator.CreateInstance(t, parameters) as Form;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
return null;
}
如果它所希望的'IList'? – dasblinkenlight
你想达到什么目的?假设构造函数需要一个非空的列表,你应该添加到列表中以使其工作吗?或者你是否知道所有的ctors只有基元,可以为空但不为空的集合,或者具有这种构造器的对象实例?在这种情况下,它可能会运行 –
boiut让用户选择值 - 没有办法计算出什么_sensible_值使用。例如。一个空列表可能会被调用 –