小例子复习下委托的应用
群里一同学问了个问题,描述如下:
void Method()
{
string name = "hello"; //需要在 Button.OnClick里使用
int age = 10;
if(Button.PerformClick()) //伪代码
{
//do something
}
}
void Button.OnClick() //伪代码
{
//此处要使用Method里的name,age
}
{
string name = "hello"; //需要在 Button.OnClick里使用
int age = 10;
if(Button.PerformClick()) //伪代码
{
//do something
}
}
void Button.OnClick() //伪代码
{
//此处要使用Method里的name,age
}
这段代码是为了描述问题写的模拟伪代码, 问题是不使用全局变量 name 和 age的时候,要将 name age传递到按钮的 OnClick事件函数里,
其实处理这个问题。首先想到的就是 委托,想到委托就会想到委托的参数,所以这里必须自己定义个参数类,来包含 name 和 age参数
先来定义个委托参数类
public class XEventArgs : EventArgs
{
public XEventArgs(string name,int age)
{
Name = name;
Age = age;
Another = new List<string>();
}
public string Name;
public int Age;
public List<string> Another;
}
{
public XEventArgs(string name,int age)
{
Name = name;
Age = age;
Another = new List<string>();
}
public string Name;
public int Age;
public List<string> Another;
}
有个委托参数,接着定义委托
public delegate void EventHandler<XEventArgs>(XButton sender,XEventArgs e);
委托定义里第一个参数是 Xbutton类型,这哪里来的呢,这里就要想到了,有了委托还不行,如何要使用这个委托,又如何将委托参数传递给Button的OnCLick事件函数呢
这里就需要自定义Button控件了,完整代码如下
public delegate void EventHandler<XEventArgs>(XButton sender,XEventArgs e);
public class XEventArgs : EventArgs
{
public XEventArgs(string name,int age)
{
Name = name;
Age = age;
Another = new List<string>();
}
public string Name;
public int Age;
public List<string> Another;
}
public class XButton:Button
{
public XButton()
{
//...
}
public event EventHandler<XEventArgs> XOnClick;
public virtual void PerformClick(XEventArgs e)
{
if (XOnClick!=null)
XOnClick(this, e);
base.PerformClick();
}
}
public class XEventArgs : EventArgs
{
public XEventArgs(string name,int age)
{
Name = name;
Age = age;
Another = new List<string>();
}
public string Name;
public int Age;
public List<string> Another;
}
public class XButton:Button
{
public XButton()
{
//...
}
public event EventHandler<XEventArgs> XOnClick;
public virtual void PerformClick(XEventArgs e)
{
if (XOnClick!=null)
XOnClick(this, e);
base.PerformClick();
}
}
通过上述代码可以发现,自定义的Xbutton控件 提供了一个接口 void PerformClick(XEventArgs e),
同时定义了一个自定义事件 event EventHandler<XEventArgs> XOnClick;
到这里应该就比较清楚了, 我们的窗体中应该用 XButton 来替代Button ,然后绑定它的 XOnClick事件
在原来问题的 Method() 函数中 执行 XButton的 PerformClick(XEventArgs) 函数,
测试代码如下:

XButton xbtn;
public Form1()
{
InitializeComponent();
xbtn = new XButton();
//关键点
xbtn.XOnClick += new EventHandler<XEventArgs>((sender, e) =>
{
MessageBox.Show(string.Format("Name={0},Age={1}", e.Name, e.Age));
});
}
void Method()
{
string name = "hello";
int age = 10;
//关键点
xbtn.PerformClick(new XEventArgs(name,age));
}
public Form1()
{
InitializeComponent();
xbtn = new XButton();
//关键点
xbtn.XOnClick += new EventHandler<XEventArgs>((sender, e) =>
{
MessageBox.Show(string.Format("Name={0},Age={1}", e.Name, e.Age));
});
}
void Method()
{
string name = "hello";
int age = 10;
//关键点
xbtn.PerformClick(new XEventArgs(name,age));
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架