使用IS运算符来标识Form的类型

时间:2012-02-07 16:32:12

标签: c# reflection

我想写一个常用方法来检查表单是否已经打开。如果它是打开的,那么只需激活它。否则显示它。现在我的挑战是我将哪种类型的参数传递给Test方法?

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

            }
        }

由于  NISHANT

5 个答案:

答案 0 :(得分: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>();

答案 1 :(得分:4)

我会选择像

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

        }
     }

答案 2 :(得分:4)

你可以使用这样的Generic方法:

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"]

答案 3 :(得分:1)

编写代码的方式需要传递相应Form类的Type ...

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

另一种方法是使用generice - 请参阅the answer from Heinzi

答案 4 :(得分:0)

在两个解决方案中,结果是如果同一个类的窗口更多,则打开所有这些窗口。