2012-11-04 146 views
1

我有一個函數,我想使泛型來顯示錶單。我希望函數檢查表單是否已經打開,如果沒有創建窗體的新實例並顯示它,則將其置於頂端。Casting type to object in C#

檢查表單是否打開的第一部分都是好的,但是我從T中創建並創建了一個新的T型表單對象。我已經使用這行代碼創建了一個形式爲obj = Activator.CreateInstance<T>();的實例,但是它不顯示intellisense中的所有方法和屬性。代碼Form x = new Form1. x將顯示所有的方法和屬性。

我相信我在這裏做錯了什麼,請給我照亮一些光。

 private static void ShowForm<T>() 
    { 
     T obj = default(T); 

     List<T> opened = FormManager.GetListOfOpenForms<T>(); 
     if (opened.Count == 0) 
     { 
      // not opened 

      // obj does not show all properties and methods 
      obj = Activator.CreateInstance<T>(); 


      // x shows all properties and methods 
      frmLogin x = new frmLogin(); 

     } 
     else 
     { 
      // opened 

     } 

    } 

回答

5

需要約束噸至繼承Form

private static void ShowForm<T>() where T : Form, new() 

一旦編譯器知道T保證繼承Form,你就可以使用定義的所有成員Form或其基地類。

您的問題的更一般答案是將obj轉換爲Form

+0

無參數構造函數的約束是否真的有用? – LightStriker

+0

+1。 @LightStriker,是的,它將允許刪除對CreateInstance的不必要的反射調用。 –

+0

@AlexeiLevenkov:實際上,'new T()'編譯爲Activator.CreateInstance。該約束將運行時錯誤轉換爲編譯時錯誤。 – SLaks