为多个事件侦听器调用反射方法 C#
Invoking reflected methods for several event listeners C#
我有一个 windows 表格,在 Panel[,]
中有几个面板。每次用户单击任何面板时,我都希望为单击的面板处理一个特定且唯一的事件。我考虑过让一个事件有一个 switch 语句,但我认为这是相对相同的做法,并且使用起来会更混乱。也许我对事件处理程序的设计全错了..
我正在尝试做的事情与此类似:
Type t = typeof(Program);
var methods = t.GetMethods(BindingFlags.Public | BindingFlags.Static).Where(m => m.Name.EndsWith("_click")).ToArray();
char[] cArr = { 'a', 'b', 'c', 'd' };
for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 4; j++)
{
MethodInfo method = methods.Single(
m => m.Name == cArr[i].ToString() + (j + 1) + "_click");
// method.Invoke(null, null);
// myPanels[i, j].Click += new EventHandler( );
}
}
private void a1_click(object sender, System.EventArgs e)
{
MessageBox.Show("Unique event A1");
}
private void a2_click(object sender, System.EventArgs e)
{
MessageBox.Show("Unique event A2");
}
//...
private void d4_click(object sender, System.EventArgs e)
{
MessageBox.Show("Unique event D4");
}
如果您知道通过设计方法来处理事件的更好方法,请告诉我,我很想了解这一点。但是对于这个例子来说,我应该如何将方法放在 EventHandler 中。如果我手动分配它们,我可以这样做:
myPanels[0, 0].Click += new EventHandler(a1_click);
但我宁愿遍历作业部分,或者重新考虑事件本身。
感谢任何帮助。
也许更好的方法是使用参数而不是不同的事件处理程序。
以下示例利用标签 属性 来区分哪个面板发送了事件,尽管您应该通过创建事件参数并发送它而不是空值来真正利用 EventArgs。
void Main()
{
for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 4; j++)
{
myPanels[i, j].Tag = i +" - " + j;
myPanels[i, j].Click += button_click;
// fire the event, note that the panel instance is the sender
myPanels[i, j].OnClick(null);
}
}
}
private void button_click(object sender, System.EventArgs e)
{
var pnl = sender as Panel;
if (pnl != null && pnl.Tag != null)
MessageBox.Show("Unique event "+ pnl.Tag.ToString());
}
如果你想让每个面板实现一个特殊的行为,你可以创建一个面板的子类并实现一个接口;
public interface ISpecialMethod{
void SpecialMethod();
}
public class SpecialPanel :Panel, ISpecialMethod {
public void SpecialMethod() {
/* custom logic*/
}
}
private void button_click(object sender, System.EventArgs e)
{
var pnl = sender as ISpecialMethod ;
if (pnl != null)
pnl.SpecialMethod();
}
这里的可能性是无限的。
在您的实际情况下,这不太可能是您要采用的方式,但如果您真的想动态连接您的事件,则只需对现有代码进行少量添加:
myPanels[i, j].Click += (EventHandler) method.CreateDelegate(typeof(EventHandler));
我有一个 windows 表格,在 Panel[,]
中有几个面板。每次用户单击任何面板时,我都希望为单击的面板处理一个特定且唯一的事件。我考虑过让一个事件有一个 switch 语句,但我认为这是相对相同的做法,并且使用起来会更混乱。也许我对事件处理程序的设计全错了..
我正在尝试做的事情与此类似:
Type t = typeof(Program);
var methods = t.GetMethods(BindingFlags.Public | BindingFlags.Static).Where(m => m.Name.EndsWith("_click")).ToArray();
char[] cArr = { 'a', 'b', 'c', 'd' };
for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 4; j++)
{
MethodInfo method = methods.Single(
m => m.Name == cArr[i].ToString() + (j + 1) + "_click");
// method.Invoke(null, null);
// myPanels[i, j].Click += new EventHandler( );
}
}
private void a1_click(object sender, System.EventArgs e)
{
MessageBox.Show("Unique event A1");
}
private void a2_click(object sender, System.EventArgs e)
{
MessageBox.Show("Unique event A2");
}
//...
private void d4_click(object sender, System.EventArgs e)
{
MessageBox.Show("Unique event D4");
}
如果您知道通过设计方法来处理事件的更好方法,请告诉我,我很想了解这一点。但是对于这个例子来说,我应该如何将方法放在 EventHandler 中。如果我手动分配它们,我可以这样做:
myPanels[0, 0].Click += new EventHandler(a1_click);
但我宁愿遍历作业部分,或者重新考虑事件本身。
感谢任何帮助。
也许更好的方法是使用参数而不是不同的事件处理程序。
以下示例利用标签 属性 来区分哪个面板发送了事件,尽管您应该通过创建事件参数并发送它而不是空值来真正利用 EventArgs。
void Main()
{
for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 4; j++)
{
myPanels[i, j].Tag = i +" - " + j;
myPanels[i, j].Click += button_click;
// fire the event, note that the panel instance is the sender
myPanels[i, j].OnClick(null);
}
}
}
private void button_click(object sender, System.EventArgs e)
{
var pnl = sender as Panel;
if (pnl != null && pnl.Tag != null)
MessageBox.Show("Unique event "+ pnl.Tag.ToString());
}
如果你想让每个面板实现一个特殊的行为,你可以创建一个面板的子类并实现一个接口;
public interface ISpecialMethod{
void SpecialMethod();
}
public class SpecialPanel :Panel, ISpecialMethod {
public void SpecialMethod() {
/* custom logic*/
}
}
private void button_click(object sender, System.EventArgs e)
{
var pnl = sender as ISpecialMethod ;
if (pnl != null)
pnl.SpecialMethod();
}
这里的可能性是无限的。
在您的实际情况下,这不太可能是您要采用的方式,但如果您真的想动态连接您的事件,则只需对现有代码进行少量添加:
myPanels[i, j].Click += (EventHandler) method.CreateDelegate(typeof(EventHandler));