10

我正在尝试从标记为 a 的方法中访问完整的原始LuisIntent文本LuisDialog

文档将这些方法显示为采用两个参数:

IDialogContext context, LuisResult result

两者都没有公开暴露消息的原始文本。上下文对象确实包含消息,但在context.data.message.text不可访问的私有属性 () 中。

有没有办法在 中访问它context,或者可以将它传递给对话框构造函数?

4

4 回答 4

9

在新版本的 Bot Framework (1.0.2) 中,LuisResult对象现在有一个Query参数,其中包含发送到 LUIS 的原始查询。

于 2016-04-14T10:53:07.130 回答
8

您可以覆盖 LuisDialog 的 MessageReceived(...) 函数,将您需要的消息字段保留为成员变量,并在您的意图处理程序中访问这些字段。下面我修改了 SimpleAlarmDialog 以显示如何在一个意图处理程序中访问“message.Text”:

[LuisModel("c413b2ef-382c-45bd-8ff0-f76d60e2a821", "6d0966209c6e4f6b835ce34492f3e6d9")]
[Serializable]
public class SimpleAlarmDialog : LuisDialog<object>
{
    private readonly Dictionary<string, Alarm> alarmByWhat = new Dictionary<string, Alarm>();

    [Serializable]
    public class PartialMessage
    {
        public string Text { set; get; }
    }

    private PartialMessage message;

    protected override async Task MessageReceived(IDialogContext context, IAwaitable<Message> item)
    {
        var msg =  await item;
        this.message = new PartialMessage { Text = msg.Text };
        await base.MessageReceived(context, item);
    }

    [LuisIntent("builtin.intent.alarm.delete_alarm")]
    public async Task DeleteAlarm(IDialogContext context, LuisResult result)
    {
        await context.PostAsync($"echo: {message.Text}");
        Alarm alarm;
        if (TryFindAlarm(result, out alarm))
        {
            this.alarmByWhat.Remove(alarm.What);
            await context.PostAsync($"alarm {alarm} deleted");
        }
        else
        {
            await context.PostAsync("did not find alarm");
        }

        context.Wait(MessageReceived);
    }
}
于 2016-04-11T21:00:31.943 回答
1

如果您闯入该方法,您可以在快速查看中看到上下文对象具有非公共属性,直到 context.data.mesage.Text(注意“消息”的拼写错误)。由于该属性是非公开的,因此您可以通过反射来获取它(请参阅如何在 C# 中获取私有字段的值中的 GetInstanceField?

        Microsoft.Bot.Builder.Dialogs.Internals.JObjectBotData data = GetInstanceField(typeof (Microsoft.Bot.Builder.Dialogs.Internals.DialogContext), context, "data") as Microsoft.Bot.Builder.Dialogs.Internals.JObjectBotData;            
        Microsoft.Bot.Connector.Message originalMessage = GetInstanceField(typeof(Microsoft.Bot.Builder.Dialogs.Internals.JObjectBotData), data, "mesage") as Microsoft.Bot.Connector.Message;
        string originalMessageText = originalMessage.Text;
于 2016-04-11T16:46:51.690 回答
0

您可以通过使用 LuisResult 的 Query 属性来执行此操作,

[LuisIntent(intentName: "someIntentName")]
private async Task Eligibility(IDialogContext context, LuisResult result)
 {
   await context.PostAsync($"The original text is: {result.Query}");
   context.Wait(MessageReceivedAsync);
}
于 2017-07-04T06:36:27.610 回答