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.
}
如果没有类发件人的事先知识实际上为这种方法带来了什么,你如何创建一个可用的发件人实例呢?
答案 0 :(得分:5)
在绝大多数情况下你知道哪些控件将触发事件,因为你(程序员)将它们连接起来。例如,如果您将此事件连接到一个按钮(甚至多个按钮),您知道发件人是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
它可能看起来很混乱,但是因为你没有在事件处理程序中说明你真正想要做的事情,这是在一个事件中处理多个可能的最干净的方式发件人类型。
另一种选择是创建多个事件处理程序(每种类型一个)并将它们连接到各自的类型。我无法想到Button
和TextBox
之间的许多代码重用方案。
答案 1 :(得分:0)
我认为动态关键字是您正在寻找的。在编译时,编译器假定btn中有Text
属性。
private void button1_Click(object sender, EventArgs e)
{
var btn = (dynamic)sender;
string text = btn.Text;
}
答案 2 :(得分:0)
这是一个DataBindingComplete变体,用于清除DataGridView控件的默认选择。我有多个DataGridView控件跨多个选项卡,只需要这一个事件处理程序,这是非常棒的。这是基于VladL的回应所以所有的功劳都归功于他们。
private void Dynamic_DataBindingComplete(Object sender, DataGridViewBindingCompleteEventArgs e)
{
var control = (dynamic) sender;
control.ClearSelection();
}