Main方法的IL代码IL_0021: call class [mscorlib]System.Delegate [mscorlib]System.Delegate::Combine(class [mscorlib]System.Delegate, class [mscorlib]System.Delegate) 对应的就是+=操作的IL代码。+=实际上是调用了System.Delegate类的Combine(Delegate,Delegate)方法,参数为两个委托对象。之所以能调用System.Delegate类的方法,是因为System.MulticastDelegate类继承自它,而我们所有的委托都继承自System.MulticastDelegate类。事实上,如果你查MSDN你会发现System.Delegate类的Combine是重载的,共有两个重载,如下所示:
代码using System;
using System.Collections.Generic;
using System.Text;
namespace DelegateTest
{
class Program
{
publicdelegatestring CallBack(string name, int number);
string PersonInfo1(string name, int no)
{
System.Console.WriteLine("调用了PersonInfo1");
return "Person1's name is " + name + ",number is " + no;
}
string PersonInfo2(string name, int no)
{
System.Console.WriteLine("调用了PersonInfo2");
return "Person2's name is " + name + ",number is " + no;
}
staticvoid Main(string[] args)
{
Program pr = new Program();
CallBack cb = pr.PersonInfo1;
cb += pr.PersonInfo2;
System.Console.WriteLine("最终返回结果: "+cb("skynet",23));
}
}
}
代码publicsealedoverride Delegate[] GetInvocationList()
{
object[] objArray = this._invocationList asobject[];
if (objArray == null)
{
returnnew Delegate[] { this };
}
int num = (int) this._invocationCount;
Delegate[] delegateArray = new Delegate[num];
for (int i = 0; i < num; i++)
{
delegateArray[i] = (Delegate) objArray[i];
}
return delegateArray;
}
安装上面的思路我们写出如下代码:
代码using System;
using System.Collections.Generic;
using System.Text;
namespace DelegateTest
{
class Program
{
publicdelegatestring CallBack(string name, int number);
string PersonInfo1(string name, int no)
{
System.Console.WriteLine("调用了PersonInfo1");
return "Person1's name is " + name + ",number is " + no;
}
string PersonInfo2(string name, int no)
{
System.Console.WriteLine("调用了PersonInfo2");
return "Person2's name is " + name + ",number is " + no;
}
staticvoid Main(string[] args)
{
Program pr = new Program();
CallBack cb = pr.PersonInfo1;
cb += pr.PersonInfo2;
StringBuilder strs = new StringBuilder();
Delegate[] arrayDelegates = cb.GetInvocationList();
foreach (CallBack d in arrayDelegates)
{
strs.AppendFormat("{0}{1}",d("skynet",23),Environment.NewLine);
}
System.Console.WriteLine("最终返回结果:");
System.Console.WriteLine(strs.ToString());
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?