C# 在构造函数期间设置事件处理程序

C# 在构造函数期间设置事件处理程序,c#,event-handling,initialization,C#,Event Handling,Initialization,我看到一个问题 如果我理解正确的话。做这样的事是不可能的 TableLayout tl = new TableLayout () { MouseClick += myMouseClickHandler } 但设置此处理程序的首选解决方案是什么 使新类继承自TableLayout并 …将对处理程序的引用添加到构造函数 …创建公共独立方法,如SetupSomeEventHandler(MouseEventHandler-meh) …或者可能存在更优雅的解决方案?如果您真的想在构造函数中设置

我看到一个问题

如果我理解正确的话。做这样的事是不可能的

TableLayout tl = new TableLayout ()
{
    MouseClick += myMouseClickHandler
}
但设置此处理程序的首选解决方案是什么

使新类继承自
TableLayout

…将对处理程序的引用添加到构造函数

…创建公共独立方法,如
SetupSomeEventHandler(MouseEventHandler-meh)


…或者可能存在更优雅的解决方案?

如果您真的想在构造函数中设置它,您可以这样做

WPF版本

public class TableLayout 
{
    public TableLayout()
    {
    }
    public TableLayout (Action<object, RoutedEventArgs> clickHandler)
    {
        MouseClick += clickHandler;
    }
}
public class TableLayout 
{
    public TableLayout()
    {
    }
    public TableLayout (Action<object, EventArgs> clickHandler)
    {
        MouseClick += clickHandler;
    }
}

我假设您使用的是WinForms,如果我向您展示如何使用
表单
,您将能够将其应用到
TableLayout
类中

以下是您需要做的:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    public Form1(MouseEventHandler handler)
        : this()
    {
        this.MouseClick += handler;
    }
}
创建此表单时,我可以执行以下操作:

var form1 = new Form1((s, e) => { MessageBox.Show("You clicked me!"); })
在您的情况下,这将如下所示:

TableLayout tl = new TableLayout(myMouseClickHandler);

为什么要使用
Func clickHandler
?处理程序是操作,不返回值。此外,已经定义了相应的委托。您认为是否应该使用
MouseEventHandler
&
routedventhandler
?现在你的代码没有编译。请在发布前测试这两种解决方案。@Enigmativity试图帮助OP,可能这不能100%工作,因为你是对的,我没有编译它,但可以指导OP。我试图帮助他,而不是你。对不起。@Enigmativity顺便说一句,如果你试图帮助,你可以编辑我的问题或发布另一个答案。好的,我只是在构造函数之后添加处理程序。我希望在未来的标准中,C#可以像我一开始写的那样编译代码。
TableLayout tl = new TableLayout(myMouseClickHandler);