为什么在 C# 中调用 Delegate.GetInvokationList 后只打印一个方法名称?



我有一个关于Delegate.Target属性的查询。

我定义了委托类型BinaryOp

public delegate int BinaryOp(int x, int y);

然后,我创建了两个不同的类来为委托提供方法。

public class SimpleMath
{
public int Add(int x, int y) => x + y;
public int Subtract(int x, int y) => x - y;
}
public class SimpleDivision
{
public int Divide(int x, int y) => x / y;
}

现在,我将这些方法中的每一个添加到allThree实例中,并调用GetInvocationList()检查委托中每个MethodTarget

static void Main(string[] args)
{
SimpleMath s = new SimpleMath();
SimpleDivision d = new SimpleDivision();
BinaryOp add = s.Add;
BinaryOp subtract = s.Subtract;
BinaryOp division = d.Divide;
BinaryOp allThree = division + add + subtract;
DisplayDelegateInfo(allThree);
}
static void DisplayDelegateInfo(Delegate d)
{
foreach (Delegate member in d.GetInvocationList())
{
Console.WriteLine($"Method name: {d.Method}");
Console.WriteLine($"Type name: {d.Target}");
}
}

从下面看到的输出中,仅打印方法Subtract。 为什么?

输出:

Method name: Int32 Subtract(Int32, Int32)
Type name: Delegates.SimpleMath
Method name: Int32 Subtract(Int32, Int32)
Type name: Delegates.SimpleMath
Method name: Int32 Subtract(Int32, Int32)
Type name: Delegates.SimpleMath

你在 d 上调用 Console.WriteLine,而不是你的迭代变量成员。您的委托 d 是一个链接的委托,并返回分配给它的最后一个委托,即减去。

static void DisplayDelegateInfo(Delegate d)
{
foreach (Delegate member in d.GetInvocationList())
{
Console.WriteLine($"Method name: {member.Method}");
Console.WriteLine($"Type name: {member.Target}");               
}
}

最新更新