私は一日中、このアイデアを打ち砕いてしまいました。私は分かりません。私がやっていることはばかげて良い方法があるかもしれないが、これが私の考えが私をもたらしたところだ。型名を文字列として型にキャストするにはどうすればよいですか?
私は、WinFormsの中でフォームをロードするために、一般的なメソッドを使用しようとしています:
protected void LoadForm<T>(ref T formToShow, bool autoLoaded) where T : FormWithWorker, new()
{
// Do some stuff
}
形はToolStripMenuItem(項目の選択によりまたはOpen Windowsのメニュー項目を使用してのいずれか)によってロードされています。それらは遅延ロードされているため、MDI親内のフォームのフィールドがありますが、必要になるまではnullになります。私は、メニューアイテムのすべてのクリックを処理するToolStripMenuItem_Clickに使用される共通のメソッドを持っています。このメソッドは、ToolStripMenuItemの名前が、対応するフォームクラス名に対して選択されたパターンと一致することを除いて、どのフォームが呼び出されているかを知る実際の方法を持っていません。したがって、ToolStripMenuItemの名前を使用して、要求されているフォームの種類の名前と、そのフォームの参照を格納するために割り当てられたプライベートフィールドの名前を指定できます。
これを使用して、特定のタイプのセット(望ましくない)を呼び出すために、ハードコードされたタイプと文字列の一致を伴う拡大/縮小switchステートメントを使用するか、Reflectionを使用してフィールドを取得してインスタンスを作成しますタイプの。私の問題は、System.Activator.CreateInstance
は、必要な型にキャストできないObjectHandlerを提供することです。ここで私がこれまで持っているものの抜粋です:
string formName = "_form" + ((ToolStripMenuItem)sender).Name.Replace("ToolStripMenuItem", "");
string formType = formName.Substring(1);
FieldInfo fi = this.GetType().GetField(formName, BindingFlags.NonPublic | BindingFlags.Instance);
FormWithWorker formToLoad = (FormWithWorker)fi.GetValue(this);
if (formToLoad == null)
{
formToLoad = (????)System.Activator.CreateInstance("MyAssemblyName", formType);
}
this.LoadForm(ref formToLoad, false);
fi.SetValue(this, formToLoad);
私はのために行くのタイプの文字列名を(????)知っているが、それは変化するため、コンパイル時に、私は種類を知りません。私は、このキャスト/インスタンス化を機能させるためにさまざまな方法を試しましたが、どれも成功していません。私はそれが文字列としてだけ型を知っているそのようなキャストを実行することが可能かどうかを知りたいと思うでしょう。私はType.GetType(string, string)
を使ってキャストを試みましたが、コンパイラはそれを気に入らなかった。私がちょうどそれをやっているので、フォームを動的にロードする方法について誰かが別のアイデアを持っているなら、それについて私に知らせてください。
formformToLoadオブジェクトを作成し、LoadFormおよびSetValueポイントでFormWithWorkerにキャストしますか? – asawyer