C# 全局函数库

C# 全局函数库,c#,events,delegates,C#,Events,Delegates,我有几个控件,例如ToolStripMenuItem和按钮,它们需要将函数绑定到其单击事件。它们将生成一个新的表单,或将选项卡页面添加到当前的选项卡控件。我可能会有几个不同的控件,它们将需要相同的函数,因此我考虑建立一个全局函数库 我将有一个名为Services的类,如下所示: public class Services { TabControl container; delegate void fonction(int id); Dictionary<string

我有几个
控件
,例如
ToolStripMenuItem
按钮
,它们需要将函数绑定到其单击事件。它们将生成一个新的
表单
,或将
选项卡页面
添加到当前的
选项卡控件
。我可能会有几个不同的
控件
,它们将需要相同的函数,因此我考虑建立一个全局函数库

我将有一个名为
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);
    }
}
公共类服务{
控制容器;
委托无效函数(int id);
字典函数=新字典();
公共服务(选项卡控制){
容器=控制;
初始化函数();
}
公共委托Getfunction(字符串名称){
if(functions.ContainsKey(name))
返回函数[名称];
其他的
抛出新的NotImplementedException(“未能实例化”+名称);
}
//所有所需功能的列表
//函数示例
私人贷款(int id){
string name=“Loan”+id.ToString();
Form newForm=新贷款();
newForm.Text=Properties.Resources.MakeLoan;
newForm.ShowDialog();
}
私有函数(){
f基金=新基金(ProductLoan);
增加(“贷款”,f);
//对于每个函数
//f=新功能(名称);
//函数。添加(名称,f);
}
}
该类将在程序启动时实例化并全局存储,以便可以在任何地方访问如果我这样做是错误的,请纠正我,但我没有将
服务
类设置为静态,因为它需要
选项卡控件的实例
并初始化函数列表。


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

您使用的是什么编程环境?我知道,在VisualStudio中,如果有多个控件使用相同的方法,则可以在其中一个单击事件下创建该方法,然后,对于需要相同方法的每个控件,可以通过将控件实际绑定到添加该方法的第一个控件的单击事件来绑定该方法。至于创建一个包含每个必需函数的存储库,我总是更幸运地只创建单个单击事件,我建议只创建一个类来保存函数并使其保持静态。因为服务需要先实例化其他对象,所以只需实例化TabControl,然后实例化保存方法的静态类。

您可以创建类似于
TabController
PopupController
的对象,使用公共实例方法分别创建选项卡和表单。
TabController
可能依赖于
TabControl
,而
popupcontroller
可能依赖于父窗体(如果需要)。每个
控件
都有自己的事件处理程序,其中将调用
TabController
PopupController
中的方法

UPD:


由于
控件是动态创建的,因此最好使用一个通用工具来连接事件处理程序。但接线逻辑应该与事件处理程序实现逻辑分离,以使其更具可读性和可维护性。例如,
IntelligentEventHandlerWiringManager
可能对
TabController
PopupController

具有依赖关系,您可以在加载时进行一次静态分配
TabControl
。我更喜欢静态成员做一些“通用的事情”,但我仍然需要初始化函数列表。
Services
类可以是satic,因为不需要参数。我唯一担心的是,任何程序员都可以尝试获取函数,即使他没有分配TabControl。我想确保使用
服务的唯一方法是初始化TabControl实例/引用和函数列表。我已经编辑了您的标题。请看“”,其中的共识是“不,他们不应该”。我使用的确实是Visual Studio。绑定单击事件的第一个控件是
ToolStripMenu
。我如何在Dynamicly生成的其他控件中使用它的函数对我来说仍然是个谜。我可能需要在整个程序中传递我的菜单。你不必根据方法的作用传递菜单。您可以做的是,在图形编辑器中,单击“控件”,该控件应使用与您编码的第一个“控件”相同的方法。然后在侧面的事件菜单下,单击“OnClick”方法,应该有一个下拉列表,允许您为您首先编程的任何“控件”选择原始的单击方法。问题是,我的菜单和控件都是动态生成的,所以在程序执行之前,我不知道菜单会有什么功能,甚至不知道它会在哪里。好吧,很抱歉,我帮不上忙。祝你的节目好运。什么将决定生成什么?我最终使我的类成为静态的。至于wat将决定内容生成,用户权限将决定用户可以做什么和不能做什么,然后将ToolStripMenuItems附加到根菜单节点,并将适当的函数绑定到该节点。然后在这些事件生成的表单中使用相同的过程。我希望有一个类可以为TabControl和新表单提供服务。因此,我将使用带有两个控制器的
服务
,其主要思想是,如果您可以直接调用实例方法,则不需要包含委托的字典。至于TabController和PopupController的分离,它们似乎有不同的职责。对我来说,两种自然的依赖比单一的要好,一种是复合的,另一种是完全不自然的