调用context.Forward后,如何获取子对话框中的项目

After call context.Forward, how to get the item in child dialog

我有一个主要的 Luis 对话框,我需要转发 CheckListDialog 并将 'luisresult.entity' 传递给 CheckListDialog,代码如下:

context.Forward(new CheckListDialog(), this.DialogResumeAfter,result.Entities,CancellationToken.None);

问题:在"CheckListDialog"中,如何得到"result.Entities"?

PS:还有另一种解决方案可以得到Luisresult.Entities,

context.Call(new CheckListDialog(result.Entities), this.DialogResumeAfter);

此解决方案有效,但我想知道如何使用 context.Forward 获取参数值。

使用context.Forward方法时,它希望您发送IMessageActivity类型的参数。如果您只想发送您的第一个实体,那么您可以创建一个 IMessageActivity 变量,然后将其转发给您想要的方法。

["YourLuisIntent"]
public async Task YourLuisIntent(IDialogContext context, IAwaitable<IMessageActivity> argument, LuisResult result)
{
        var message = await argument;
        message .Text = result.Entities[0].Entity;
        var dialog = new CheckListDialog();
        await context.Forward(dialog, this.DialogResumeAfter, message , CancellationToken.None);

}

这是完成任务的常规方法。但是,如果您坚持将 LuisResult 传递给方法,那么 Bot Framework 允许您这样做,您可以执行以下操作:

路易斯·达格

["YourLuisIntent"]
public async Task YourLuisIntent(IDialogContext context, LuisResult result)
{
        var dialog = new CheckListDialog();
        await context.Forward(dailog, this.DialogResumeAfter, result.Entities, CancellationToken.None);

}

清单对话框

此处您需要的是 IList 类型的值,而不是 IMessageActivity。您需要牢记这一点,并且仅使用此对话框访问 Luis 实体。

public Task StartAsync(IDialogContext context)
{
         context.Wait<IList<EntityRecommendation>>(MessageReceivedAsync);
         return Task.CompletedTask;
}

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IList<EntityRecommendation>> result)
{
        var LuisResult = await result as IList<EntityRecommendation>;

        foreach( var entity in LuisResult)
        {
            await context.PostAsync($"{entity.Entity} - {entity.Type}");
        }

}