是否可以在.NET中向外部公开类的成员对象的事件?

时间:2010-08-31 18:43:22

标签: c# .net events

假设我在ASP.NET中有一个包含按钮的用户控件:

public class MyUserControl : UserControl {
    private Button btnSave = new Button();
}

我可以通过创建指向按钮的属性来将按钮的任何属性暴露给外部:

public string SaveButtonText { 
    get { return btnSave.Text; } 
    set { btnSave.Text = value; } 
}

那么我可以这样做来设置按钮的文字:

MyControl.SaveButtonText = "hello world";

我是否可以使用类似的构造将按钮的事件暴露给外部?类似的东西:

public event SaveButtonClick { return btnSave.OnClick; }
...
MyControl.SaveButtonClick += new EventHandler(...);

2 个答案:

答案 0 :(得分:25)

你可以这样做,是的:

public event EventHandler SaveButtonClick
{
    add { btnSave.Click += value; }
    remove { btnSave.Click -= value; }
}

但请注意,这有一个缺点 - 提供给事件处理程序的“sender”参数仍然是保存按钮而不是您的控件......这可能不是订阅者所期望的。另一种方法是自己订阅一次保存按钮的点击处理程序:

public event EventHandler SaveButtonClick = delegate {};

private void OnSaveButtonClicked(object sender, EventArgs e)
{
    // Replace the original sender with "this"
    SaveButtonClick(this, e);
}
...
btnSave.Click += OnSaveButtonClicked();

这个方法也有一个缺点......你最终从保存按钮到“this”的引用,可能产生影响关于垃圾收集。基本上,在保存按钮也有资格进行垃圾回收之前,您的控件将无法进行垃圾回收。在这种情况下,我非常怀疑这是一个问题,但值得注意。

答案 1 :(得分:5)

    public event EventHandler SaveButtonClick {
        add { btnSave.Click += new EventHandler (value); }
        remove { btnSave.Click-= new EventHandler (value); }
    }