使用相同的逻辑处理多个方法是否有通用的做法?

时间:2017-04-12 16:20:45

标签: c# methods

我有一个带按钮的简单菜单。每个按钮打开另一个表单。

public void apartmentDetailsButton_Click(object sender, EventArgs e)
{
    using (var form = new ApartmentDetails.View())
    {
        form.ShowDialog(this);
    }
}
public void remindersButton_Click(object sender, EventArgs e)
{
    using (var form = new Reminders.View())
    {
        form.ShowDialog(this);
    }
}
public void paymentsButton_Click(object sender, EventArgs e)
{
    using (var form = new Payments.View())
    {
        form.ShowDialog(this);
    }
}
public void documentsButton_Click(object sender, EventArgs e)
{
    using (var form = new Documents.View())
    {
        form.ShowDialog(view);
    }
}

正如您所看到的,除了包含所需表单的命名空间之外,事件处理程序几乎完全相同。现在,如果我有更多按钮怎么办?我应该每次都真的复制粘贴这种方法吗?

是否有可能为所有按钮使用一个事件处理程序或概括现有的处理程序?

2 个答案:

答案 0 :(得分:3)

假设所有类型都实现或派生自普通类型,您可以声明如下方法:

public void DisplayForm(CommonType f)
{
    using(var form = f.View())
    {
        form.ShowDialog(view);
    }
}

并称之为:

DisplayForm(new Documents());

CommonType应该是包含View方法的那个。

为了减少事件处理程序的数量,您可以声明一个事件处理程序并检查sender的类型:

public void OnButtonClick(object sender, EventArgs e)
{
    if(sender is ApartmentDetails)
    {
        DisplayForm(new ApartmentDetails());
    }
    ...
}

答案 1 :(得分:1)

因为处理不同类型的事件处理程序无法为所有按钮创建一个事件处理程序。

其中一个解决方法是使用Activator.CreateInstance,但仅限于所有表单都可以使用相同签名的构造函数创建

public void OnClick(Type viewType, Form parent)
{
    using (var form = (Form)Activator.CreateInstance(viewType))
    {
        form.ShowDialog(parent);
    } 
}

然后在构造函数中使用它来处理所有按钮

apartmentDetailsButton.Click += (sender, args) => OnClick(typeof(ApartmentDetails.View), this);
remindersButton.Click += (sender, args) => OnClick(typeof(Reminders.View), this);    
paymentsButton.Click += (sender, args) => OnClick(typeof(Payments.View), this);    

您可以通过在button.Tag

中保存显示的表单类型来摆脱lambda
private void OnButtonClick(object sender, EventArgs args)
{
    var button = (Button)sender;
    var viewType = (Type)button.Tag;

    using (var form = (Form)Activator.CreateInstance(viewType))
    {
        form.ShowDialog(this);
    } 
}

然后"订阅"事件

apartmentDetailsButton.Tag = typeof(ApartmentDetails.View);
apartmentDetailsButton.Click += OnButtonClick;

apartmentDetailsButton.Tag = typeof(Reminders.View);
remindersButton.Click += OnButtonClick;