2012-01-14 78 views
4

得到的第一个方法的名字,我有这样的代码:不能在多播委托

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); 
    } 
} 

的问题是在第一种方法的名称,它总是打印“援引”出于某种原因。 委托链接中的下一个方法正常工作。

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

+0

如果您决定本地化您的应用程序,则此方法会出现问题。 – Groo 2012-01-14 10:16:32

回答

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(这是什么+=语法变)是speced如果第一个参考回到第二委托代表是null,而不是抛出异常。

+0

哇!那它?!非常感谢我真的得到了与:) :) – moshe 2012-01-14 10:12:57

+0

唯一要注意的是,第一种方法修改了原来的代表,这意味着添加相同的“菜单项”不同的menus.might不工作。该死的Android键盘。 :-) – Groo 2012-01-14 10:18:06

+0

@moshe:我非常肯定,一个简单的'List'适合**存储项目列表**的工作,比组播委托更好。我认为你选择了错误的工具。 – Groo 2012-01-14 10:24:47