この関数は、アセンブリを読み込んで、ユーザーがリストからフォームを選択させてから呼び出しようとします。成功した場合は、フォームを返します。事前に知られていないコンストラクタにパラメータを供給するにはどうすればよいですか?
私の問題は、予想される型のパラメータでコンストラクタをインスタンス化する方法です。コンストラクタがList<string>
の空の場合はnull List<String>
を指定する必要があります。
すべてのアイデア?
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
あなたは何を達成しようとしていますか?コンストラクタが空でなければならないリストを必要とすると仮定します。あるいは、すべての要素がプリミティブ、空ではなくヌルでないコレクション、または順番にそのようなコンストラクタを持つオブジェクトのインスタンスのみを取ることは知っていますか?その場合は、ユーザが値を選択できるように –
boiutが機能する可能性があります。使用する_sensible_値を調べる方法はありません。例えば。空のリストが無効になる可能性があります –