C#如何使用构造函数中存储在变量中的classname创建新对象?

时间:2014-12-05 06:41:37

标签: c# .net winforms

我在程序中有8个表单(和计数)。我有这个重复的代码来实例化或带回每个表单的“可见”,并希望有一段模块化的代码,将执行这个片段中显示的这些检查:

//Some form classes:  
Form f2 = new Form_DisplayCustomersList();  
...and other forms too

...    

///The code that I would like to modularize, so I don't have to repeat it for every form:    
private void button1_Click(object sender, EventArgs e)    
{  
    //check form status and recreate. Show and activate - as needed.  
    if ((f2 == null) || f2.IsDisposed) 
    {  
        f2 = new Form_DisplayCustomersList();  
        showForm(f2);   
    } else 
    {  
        if (!f2.Visible) 
        {  
            showForm(f2);  
            f2.Activate();  
        } else 
        {  
            f2.Activate();  
        }  
    }           
}  

所以我认为ALLOW VARIOUS按钮点击事件会调用一个看似如下的可重用方法会很好:

public void displayThatView(Form fx) 
{  
    if (fx == null || fx.IsDisposed) 
    {  
       // Form fy = new fx();  
        fx.Show;  
    }  
    else 
    {  
        if (!fx.Visible) 
        {  
            fx.Show;  
            fx.Activate();  
        }  
        else 
        {  
            fx.Activate();  
        }  
    }  
}

并且能够以这种方式调用方法,其中f2可以是任何变量或Form类型:

private void button1_Click(object sender, EventArgs e)   
{
this.displayThatView(f2);
}

我只是进入C#几个月。我不确定是否有可能做我正在尝试的事情,但它会消除一些重复的代码!

2 个答案:

答案 0 :(得分:6)

你可以像这样制作一个静态通用助手方法:

public static class FormHelper
{
    public static TForm ShowAndActivate<TForm>(TForm form) where TForm : Form, new()
    {
        if (form == null || form.IsDisposed)
        {
            form = new TForm();
            form.Show();
        }
        else
        {
            if (!form.Visible)
            {
                form.Show();
                form.Activate();
            }
            else
            {
                form.Activate();
            }
        }
        return form;
    }
}

where TForm: Form约束可确保您的form变量是Form的(子)类。 where TForm : new()约束保证了这种类型的表单有一个无参数构造函数。更多信息:http://msdn.microsoft.com/en-us/library/d5x73970.aspx

通过返回TForm,您可以通知调用者是否创建了新表单。

答案 1 :(得分:0)

您可以将此方法设为Extension

public static class Extensions
{
    public static void displayThatView(this Form fx) 
    {  
        if (fx == null || fx.IsDisposed) {  
            Form fy = new fx();  
            fx.Show;  
        }  
        else {  
            if (!fx.Visible) {  
                fx.Show;  
                fx.Activate();  
            }  
            else {  
                fx.Activate();  
            }  
        }  
    }  
}

并称之为:

private void button1_Click(object sender, EventArgs e)   
{
    this.displayThatView();
}