我有这段代码:
public void AddMenuRow(FuncInvoker i_FuncToAdd) // add a row to menu.
{
if (d_Lines == null)
{
d_Lines = new FuncInvoker(i_FuncToAdd);
}
else
{
d_Lines += i_FuncToAdd;
}
}
用于向调用列表添加方法。
现在我想将每个方法的名称打印到控制台,所以我做了这个:
public void Show()
{
int count = 1;
string name = null;
Console.WriteLine(m_Title);
foreach (FuncInvoker list in d_Lines.GetInvocationList())
{
name = list.Method.Name;
Console.WriteLine((count++) + ". " + name);
}
}
问题在于第一个方法名称,由于某种原因总是打印“invoke”。 委托链接中的下一个方法可以正常工作。
有人可以帮我吗?我已经尝试了一切。
答案 0 :(得分:5)
在这一行:
d_Lines = new FuncInvoker(i_FuncToAdd);
...您实际上正在创建一个包装原始委托的新委托实例。此新委托的方法目标将是原始委托的Invoke
方法(假设它是单播),这解释了您正在观察的行为。
明显的解决方法是不使用包装器,只是将对原始委托的引用复制到变量:
d_Lines = i_FuncToAdd;
但是你可以完全取消你的'特殊情况'分支而只是这样做(假设参数不能是null
):
public void AddMenuRow(FuncInvoker i_FuncToAdd)
{
d_Lines += i_FuncToAdd;
}
这样可以正常工作,因为如果第一个委托是+=
,Delegate.Combine
(这是null
语法变成的)被用来返回对第二个委托的引用,而不是抛出例外。