无法在多播委托中获取第一个方法名称

时间:2012-01-14 10:01:46

标签: c# .net delegates

我有这段代码:

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”。 委托链接中的下一个方法可以正常工作。

有人可以帮我吗?我已经尝试了一切。

1 个答案:

答案 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语法变成的)被用来返回对第二个委托的引用,而不是抛出例外。