结合方法

时间:2010-07-21 18:54:07

标签: c# asp.net methods

在我的应用程序中,我有很多完全相同的复制和粘贴代码,并执行完全相同的功能(按钮单击事件等)。这些冗余代码存在于我的许多页面的代码隐藏中。所以我决定减少代码重复并将这些方法移动到类文件中,只从代码隐藏页面调用它们。

以下是我的代码中的一个按钮单击事件示例,后面从类文件中调用方法:

#region DELETE selected users - button

protected void btnDeleteSelected_Click(object sender, EventArgs e)
{
    try
    {
        UserGvUtil.DeleteSelectedUsersAndProfiles(GridView1, Msg);
    }
    catch (Exception ex)
    {
        UserGvUtil.ExceptionErrorMessage(Msg, ex);
    }
    finally
    {
        UserGvUtil.RefreshGridView(GridView1);
    }
}

#endregion

我可以将此try / catch块组合到另一个方法中并将其移动到同一个类文件中吗?因此,我在click事件中唯一拥有的是一行代码。

这样做有意义吗?不知道为什么,但我希望我的代码在文件后面尽可能干净简单,这样我就可以在一个地方进行所有编辑。

对不起,如果我没有意义。我只是在学习课程和方法,并且充满了想法。

4 个答案:

答案 0 :(得分:3)

您可以将try块中的内容移动到您传递给具有try / catch的共享方法的匿名委托中。不过,你真的不需要把刷新放到最后。事实上,如果try块成功,我认为你只想运行它。

答案 1 :(得分:1)

您可以手动连接事件处理程序。

btnDeleteSelected1.Click += Events.BtnDeleteSelected_Click;
btnDeleteSelected2.Click += Events.BtnDeleteSelected_Click;
...
btnDeleteSelected3.Click += Events.BtnDeleteSelected_Click;

public static class Events
{
  public static BtnDeleteSelected_Click(object sender, EventArgs e)
  {
     ...
  }
}

编辑(对于downvoters:???) 代码将为您提供一个单独的内容,您可以不必担心编写自定义事件时,它们都是相同的。

此外,如果实用程序方法具有相同的签名,则可以使用通用方法:

public void ExecuteGvMethod(Action<GridView, string> gvMethod, GridView gv, string msg)
{
    try
    {
        gvMethod(gv, msg);
    }
    catch (Exception ex)
    {
        UserGvUtil.ExceptionErrorMessage(msg, ex);
    }
    finally
    {
        UserGvUtil.RefreshGridView(GridView1);
    }
}

在代码中:

public static class Events
{
  public static BtnDeleteSelected_Click(object sender, EventArgs e)
  {
    ExecuteGvMethod(UserGvUtil.DeleteSelectedUsersAndProfiles, (GridView)sender, "hi of whatever");
  }
}

答案 2 :(得分:0)

  

我有很多复制和粘贴代码   这是完全一样的...(按钮   点击事件等)

将所有在多个单击处理程序后面复制的代码移动到单独的类中的方法中,并将所需的任何内容(在本例中为GridView和MSG对象)作为参数传递。如果它节省了大量重复,那么这样做是有意义的。干(不要重复自己)是一个有效的原则。

答案 3 :(得分:0)

我冒着风险,但这是我的2美分:

使用返回状态代码的方法,而不是使用try / catch。 例如(只是一个想法,而不是使用枚举,你可以使用更复杂的类):

public enum StatusCode
{
    Success = 1,
    Error =2
}

public class UserGvUtil
{
    public StatusCode getStatusAfterDelete(GridView GridView1, string Msg) 
    {
        try
        {
            DeleteSelectedUsersAndProfiles(GridView1, Msg);
            Return StatusCode.Success;
        }
        catch (Exception ex)
        {
            UserGvUtil.ExceptionErrorMessage(Msg, ex);
            Return StatusCode.Error;
        }
    }

//your other methods here
}

然后在代码背后:

protected void btnDeleteSelected_Click(object sender, EventArgs e)
{
    StatusCode sc = UserGvUtil.getStatusAfterDelete(GridView1, Msg);

    //then do something with the status code if you have to:
    if (sc==StatusCode.Error) throw new Exception("Error deleting users and profiles");
    else UserGvUtil.RefreshGridView(GridView1);

}

如果您认为它会影响性能等,那么您可以稍后更改您的尝试/捕获... ... 希望它有所帮助。