【问题标题】:Subscribe to an Action event with a different return type method使用不同的返回类型方法订阅 Action 事件
【发布时间】:2021-10-11 06:38:35
【问题描述】:

我有一个活动:

public event Action OnDamageTaken;

我想在我的行为树中订阅它,但返回类型为 TaskStatus,当评估为 TaskStatus.Success 时,将结束树中当前的任务执行,如下所示:

Vegetation.OnDestroy += VegetationDestroyed;

public TaskStatus VegetationDestroyed()
{
    Owner.FindTask<JobChooser>().CurrentJob.OnJobCompleted();
    return TaskStatus.Success;
}

但是,我收到以下错误:

这样的事情是否可行,如果不可行,为什么?我认为由于 Action 事件不传递任何参数,因此,我们可以订阅具有任何返回类型的方法,只要该方法也不需要参数。

【问题讨论】:

    标签: c# events event-handling action


    【解决方案1】:

    您可以将方法包装在 lambda 中:

    Vegetation.OnDestroy += () => VegetationDestroyed();
    

    如果您想再次取消订阅该事件,您必须将 lambda 存储在一个变量中:

    Action onDestroy = () => VegetationDestroyed();
    Vegetation.OnDestroy += onDestroy;
    Vegetation.OnDestroy -= onDestroy;
    

    在线演示:https://dotnetfiddle.net/AOYqbf

    【讨论】:

    • 工厂销毁后,还需要退订吗?它将自己从所有列表中删除,因此我希望 GC 将其清理干净,无需取消订阅该事件。
    • 我不知道你的代码,所以我不知道你的情况是否有必要。但是如果你必须取消订阅,你可以阅读我的回答你是怎么做的。
    • 我明白了。在尝试通过存储 lambda 实现解决方案后,我收到以下错误:无法将源类型“lambda 表达式”转换为目标类型“BehaviorDesigner.Runtime.Tasks.Action”我尝试将返回类型从 TaskStatus 更改为 bool,但是错误信息保持不变。这里有什么问题?用问题的屏幕截图更新了问题。
    • 天哪,我的错。我将 Action 类型设置为 BehaviorDesigner 中的类型,因为它们的名称相同...
    猜你喜欢
    • 2020-02-25
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多