2
private void buttonCheck(object sender, EventArgs e)
{
   Type x = sender.GetType();
   var y = Activator.CreateInstance(x); //sends me back to the original problem : sender is an object, not a usable object.

   var x = (Button)sender;  // == button, but you never know what sender is until it's already in this function... so 
   dynamic z = sender; //gives you the image of sender i'm looking for, but it's at runtime, so no intellisense/actual compiletime knowledge of what sender is.
}

在没有事先知道类 sender 实际带入这个方法的情况下,你如何去创建一个可用的 sender 实例?

4

3 回答 3

6

在绝大多数情况下,您知道哪些控件将触发事件,因为(程序员)将它们连接起来。例如,如果您将此事件连接到一个按钮(或什至多个按钮),您知道发送者是 a Button,因此您可以强制转换:

var b = sender as Button;

或者

var b = (Button)sender;

任何一个都会给你完整的智能感知。

如果将此事件连接到多种控制类型,最好的办法是检查每种可能的类型:

if(sender is Button)
//  cast to Button
else if (sender is TextBox)
//  cast to TextBox
else is (sender is CobmoBox)
//  cast to ComboBox

它可能看起来很混乱,但是由于您没有在事件处理程序中说明您真正想要做什么,这是在一个事件中处理多种可能的发件人类型的最干净的方式。

另一种选择是只创建多个事件处理程序(每种类型一个)并将它们连接到它们各自的类型。我想不出 aButton和 a之间有很多代码重用场景TextBox

于 2013-01-01T15:35:17.950 回答
0

我认为动态关键字是您正在寻找的。在编译时编译器假定Textbtn 中有属性。

  private void button1_Click(object sender, EventArgs e)
  {
     var btn = (dynamic)sender;

     string text = btn.Text;
  }
于 2013-01-01T15:35:55.780 回答
0

这是一个从 DataGridView 控件中清除默认选择的 DataBindingComplete 变体。我有多个跨多个选项卡的 DataGridView 控件,并且只需要一个事件处理程序即可,这太棒了。这是基于 VladL 的回应,所以所有的功劳都应该归于他们。

    private void Dynamic_DataBindingComplete(Object sender, DataGridViewBindingCompleteEventArgs e)
    {
        var control = (dynamic) sender;
        control.ClearSelection();
    }
于 2015-07-21T19:27:50.150 回答