gpt4 book ai didi

c# - 无法获取多播委托(delegate)中的第一个方法名称

转载 作者:太空狗 更新时间:2023-10-30 01:08:39 27 4
gpt4 key购买 nike

我有这个代码:

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

有人可以帮我解决这个问题吗?我什么都试过了。

最佳答案

在这一行中:

d_Lines = new FuncInvoker(i_FuncToAdd);

...您实际上是在创建一个包装原始委托(delegate)的委托(delegate)实例。这个新委托(delegate)的方法目标将是原始委托(delegate)的 Invoke 方法(假设它是单播的),它解释了您观察到的行为。

明显的解决方法是不使用包装器,只是将对原始委托(delegate)的引用复制到变量:

d_Lines = i_FuncToAdd;

但你也可以完全取消你的“特殊情况”分支并直接这样做(假设参数不能为 null):

public void AddMenuRow(FuncInvoker i_FuncToAdd)                    
{
d_Lines += i_FuncToAdd;
}

Delegate.Combine 起这将正常工作(这就是 += 语法的含义)被指定为在第一个委托(delegate)为 null 时返回对第二个委托(delegate)的引用,而不是抛出异常。

关于c# - 无法获取多播委托(delegate)中的第一个方法名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8861493/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com