我有一些表格,在其中我有一些基本相同的事件功能
我试图实现一个'Shared'类并将Eventhandler链接到该函数,但是当我给函数提供必要的保护级别时,它会抱怨它是非静态的,我也必须使它静态化。
我不是静态功能的粉丝,所以问:有更好的方法吗?
(如果上述情况不明确:我想这样做:Set up single event handler for multiple buttons in .NET?但是有多个表单而不是多个控件)
编辑:根据要求提供更多信息:
我是关于代码重复的OCD,我的程序同时有多个表单活动/隐藏,显然我想在按下'x'时关闭整个程序:
class Shared
{
public static void FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}
public static void FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("Are you sure you want to exit?", "Confirm exit", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
e.Cancel = true;
}
}
}
非常简单的功能,我知道,但我不喜欢重复:P
“public static”的上述“配置”工作正常,但我只是想知道是否有“更好的方法”(tm)
答案 0 :(得分:1)
如果您不想要静态类,则有2种简单的选项可以满足大多数偏好:
对于单身人士:
class EventMangler {
private static readonly _instance = new SomeHandler ();
// although you don't like static methods :(
static EventMangler Instance {
get { return _instance; }
public void SomeEventHandler (object sender, EventArgs e) {
// handle event
}
}
// use EventMangler.Instance
public MyForm () {
InitializeComponent();
button1.Click += EventMangler.Instance.SomeEventHandler;
}
要将参数传递给Form的构造函数,您有更多选择:(a)传递对处理程序对象的引用,或(b)传递对处理程序本身的引用。我更喜欢选项(b)用于单个处理程序。否则,如果是父对象 - 例如EventMangler
- 有多个处理程序,使用选项(a):
// remove singleton Instance method from EventMangler
// instantiate EventMangler in Program and pass to Form ctors
// pass a single handler reference as Action
public MyForm (Action<object, EventArgs> handler) {
InitializeComponent();
button1.Click += handler;
}
答案 1 :(得分:1)
您可以使用静态方法,然后将处理委托给实例,然后才使用OOP的所有漂亮
public static void GeneralHandler(object sender, EventArgs args)
{
instance.Handle(sender, args);
}
private static MyProcessingClass instance = new MyProcessingClass();
订阅
button1.Event1 += GeneralHandler;
Button1.Event2 += GeneralHandler;
Button1.Event1 += GeneralHandler;
您可以进一步增强实现以支持依赖注入,例如引入HandlerProvider
并在那里封装创建机制,同时仅暴露外部接口