我有一个关于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()
来检查委托中每个Method
的Target
:
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}");
}
}