好吧,我現在整天都在想這個想法,而且我已經達到了我承認我只是不知道的部分。可能我所做的只是愚蠢的,還有更好的辦法,但這是我思想給我帶來的地方。如何將類型名稱轉換爲字符串?
我試圖用一個通用的方法來加載形式的WinForms:
protected void LoadForm<T>(ref T formToShow, bool autoLoaded) where T : FormWithWorker, new()
{
// Do some stuff
}
的形式由一個ToolStripMenuItem(通過項目的選擇或使用打開Windows菜單項)加載。它們是延遲加載的,因此MDI父級中有表單的字段,但在需要它們之前它們爲空。我有一個用於處理所有菜單項點擊的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)
來執行轉換,但編譯器不喜歡它。如果有人對如何動態加載表單有不同的想法,因爲我只是在愚蠢地做,請讓我知道。
make formToLoad對象,並將其轉換爲LoadForm和SetValue點處的FormWithWorker? – asawyer 2011-01-28 19:14:25