我正在尝试将带有参数的方法作为回调动作。我的方法是通过委托分配回调操作。但是,当我调用回调时,未调用我在委托中使用的方法。而是调用了我声明了回调的方法。为什么会这样?
我以前已经使用过这种方法很多次,并且总是按预期的方式工作。
在下面的图片中,我希望回调的方法名称为“ OnPhaseFinished”,而不是“ StartCurrentPhase”:
让我们将您的代码放入SharpLab,并查看编译器生成的内容。
我正在使用此代码,它近似于您问题中的代码:
using System;
public class C {
private Phase _currentPhase;
private void StartCurrentPhase()
{
Action callback = delegate { OnPhaseFinished(_currentPhase); };
_currentPhase.Activate(callback);
}
private void OnPhaseFinished(Phase currentPhase)
{
}
}
public class Phase
{
public void Activate(Action callback) { }
}
然后编译器生成:
public class C
{
private Phase _currentPhase;
private void StartCurrentPhase()
{
Action callback = new Action(<StartCurrentPhase>b__1_0);
_currentPhase.Activate(callback);
}
private void OnPhaseFinished(Phase currentPhase)
{
}
[CompilerGenerated]
private void <StartCurrentPhase>b__1_0()
{
OnPhaseFinished(_currentPhase);
}
}
public class Phase
{
public void Activate(Action callback)
{
}
}
您可以看到编译器已将您的delegate { OnPhaseFinished(_currentPhase); };
变成了C
类的私有方法:
private void <StartCurrentPhase>b__1_0()
{
OnPhaseFinished(_currentPhase);
}
然后它创建Action
委托的实例,指向此生成的<StartCurrentPhase>b__1_0
方法。
这是编译器通过创建一个新的私有方法(有时在当前类上,有时在一个全新的类上)来实现匿名委托(和lambda)的方法。
碰巧在当前类之后命名了它生成的<StartCurrentPhase>b__1_0
方法,但这完全是它的决定-它可以将其命名为任何喜欢的名称。