2012-02-07 51 views
3

我想編寫一個常用的方法來檢查表格是否已經打開。如果它是開放的,那就激活它。否則顯示它。現在我的挑戰是我傳遞給測試方法的參數是什麼類型?使用IS操作符來識別表格的類型

private void Test(?? ??) 
     { 
      bool isFormOpen = false; 
      foreach (Form form in Application.OpenForms) 
      { 
       if (form is ??) 
       { 
        isFormOpen = true; 
        form.Activate(); 
       } 
      } 
      if (!isFormOpen) 
      { 

      } 
     } 

感謝 NISHANT

回答

1

你的代碼寫入您需要通過相應的Form類的Type的方式......

  if (form.GetType() == theTypeParam) 
      { 
       isFormOpen = true; 
       form.Activate(); 
      } 

另一種方法是使用generice - 見the answer from Heinzi爲那。

+0

請問你能簡單地給我看看代碼嗎?這將有所幫助。 – Nishant 2012-02-07 16:36:19

+0

@Nishant查看我的更新... – Yahia 2012-02-07 16:37:57

7

因爲你基本上是傳遞一個類型,你可以使該方法一般:

private void ActivateIfOpen<T>() 
{ 
    foreach (Form form in Application.OpenForms) 
    { 
     bool isFormOpen = false; 
     if (form is T) 
     { 
      isFormOpen = true; 
      form.Activate(); 
     } 
    } 
    ... 
} 

// call like this 
ActivateIfOpen<MyMainForm>(); 
4

我會的東西去像

private void Test<TForm>() 
     where TForm : Form 
    { 
     TForm form = Application.OpenForms.OfType<TForm>().SingleOrDefault(); 
     if (form != null) 
     { 

     } 
    } 
+0

如果兩個或多個相同表單類型的實例處於打開狀態,此代碼是否按預期工作? – Flowerking 2012-02-07 16:45:00

+1

如果2個或更多它會拋出異常,但這是我決定用戶想要的行爲,因爲他說如果它已經打開激活它,如果沒有,然後創建它。看起來好像他正在使用這個作爲警衛來確保只有一個表單的一個實例是開放的。 – Fen 2012-02-07 16:46:46

4

你可以使用一個通用的方法是這樣的:

private static void Test<T>() 
    where T : Form 
{ 
    foreach (Form f in Application.OpenForms) 
    { 
     if (f is T) 
     { 
     } 
    } 
} 

或者您可以將表單的類型傳遞給方法

private static void Test(Type formType) 
{ 
    foreach (Form f in Application.OpenForms) 
    { 
     if (f.GetType() == formType) 
     { 
     } 
    } 
} 

另一件事是Application.OpenForms也有一個index[string name]參數。因此,如果您不想使用該類型來標識表單,則還可以使用以下名稱通過名稱標識它:Application.OpenForms["myFormName"]

0

在兩種解決方案中,結果是如果有更多同一類的窗口,則所有這些窗口被打開。