全局功能库

时间:2013-05-16 14:22:55

标签: c# events delegates

我有几个Control,例如ToolStripMenuItemButton,需要将一个函数绑定到其click事件。他们会生成新的Form或向当前TabPage添加TabControl。我可能最终会有几个需要相同功能的Control,所以我想创建一个Global函数库。

我会有一个名为Services的类看起来像这样:

public class Services {
    TabControl container;
    delegate void fonction(int id);
    Dictionary<string, fonction> functions = new Dictionary<string, fonction>();

    public Services(TabControl control) {
        container = control;
        InitFunctions();
    }

    public Delegate Getfunction(string name) {
        if (functions.ContainsKey(name))
            return functions[name];
        else 
            throw new NotImplementedException("Failed to instantiate " + name );
    }

    // List of all the desired functions
    // Function example
    private void ProductLoan(int id) {
        string name = "Loan"+id.ToString();
        Form newForm = new Loan();
        newForm.Text = Properties.Resources.MakeLoan;
        newForm.ShowDialog();
    }
    private void InitFunctions() {
        fonction f = new fonction(ProductLoan);
        functions.Add("Loan", f);
        // For each functions
        // f = new fonction(name);
        // functions.Add(name, f);
    }
}

当程序启动并全局存储时,该类将被实例化,因此可以在任何地方访问它。 纠正我,如果我这样做错了,但我没有让Services类静态,因为它需要有一个TabControl的实例并初始化函数列表。 /强>

我不知道这是不是一个好主意,所以我希望得到一些建议。

2 个答案:

答案 0 :(得分:1)

您使用的是哪种编程环境?我知道在Visual Studio中,如果你有几个使用相同方法的控件,你可以在其中一个click事件下创建该方法,然后,对于每个需要相同方法的控件,你可以通过让控件实际绑定来绑定该方法到您添加该方法的第一个控件的click事件。至于创建一个包含必要的每个函数的存储库,我总是有更好的运气只做单个点击事件,我建议只是创建一个类来保存函数并使其静态。因为Services需要首先实例化其他东西,只需实例化TabControl,然后是保存方法的静态类。

答案 1 :(得分:1)

您可以使用公共实例方法创建类似TabControllerPopupController的内容,分别用于创建标签和表单。 TabController可能依赖于TabControl,而PopupContorller将依赖于父表单(如果需要)。每个Control都有自己的事件处理程序,其中将调用TabControllerPopupController中的方法。

<强> UPD:

由于Controls是动态创建的,因此用于连接事件处理程序的通用工具可能是个好主意。但是,布线逻辑应该与事件处理程序实现逻辑分离,以使其更具可读性和可维护性。例如,IntelligentEventHandlerWiringManager可能具有TabControllerPopupController的依赖关系。