首页 > 解决方案 > Bot Framework - 如何访问部分类中定义的实体

问题描述

bf luis:generate:cs我导出了我的 LUIS 应用程序内容 (.json) 并使用命令从中生成了一个 .cs 代码:

public partial class AssistantRootDialog: IRecognizerConvert
{

并编写了另一个部分类来以更好(命名)的方式访问实体

public partial class AssistantRootDialog
{
  public String PhoneUser => Entities?.ContactName?.FirstOrDefault() ?? "<no user>";
   ...
}

在我的自适应对话框中,我将 LUI 识别的意图和实体设置如下:

new OnIntent(nameof(AssistantRootDialog.Intent.LookForMobilePhone)) {
   Actions = new List<Dialog>() {
     new SetProperty() {
       Property = "conversation.find.phone.userName",
       Value = "=turn.recognized.Entities?.ContactName[0]"
     },

我想知道如何使用PhoneUser部分类中的属性:

     new SetProperty() {
       Property = "conversation.find.phone.userName",
       Value = "=turn.recognized.PhoneNumber"  // It seems wrong !! ??
     },

任何想法?提前致谢...

标签: c#propertiesbotframeworkentity

解决方案


只是为了设置一点上下文,您必须记住,自适应对话和传统对话存在于不同的领域,并且您以不同的方式使用它们。

您可以使用自适应对话框中的传统对话框,但您不能(或者至少我还没有弄清楚如何)以相反的方式进行操作。

自适应对话框是声明性的,由 管理,DialogManager而传统对话框是命令式的,主要由您的代码管理。

您可以使用对话框在自适应对话框定义中添加自定义代码,CodeAction并访问在自适应属性分配中定义的任何属性。因此,您可以在您的操作之后定义此代码SetProperty()操作:

new CodeAction(async (dialogContext, options) =>
{
    // this is the way to get a value from adaptive dialog's state, you can "deserialize" to whatever type
    var userName = dialogContext.State.GetValue<string>("conversation.find.phone.userName");

    // you can also set any property and use it later from any adaptive expression
    dialogContext.State.SetValue("conversation.find.phone.firstName", userName.Split()[0]);

    return await dialogContext.EndDialogAsync(options);
}),

能够获取和设置属性并在“另一边”使用它们。

无论如何,我不确定这是否会达到您想要实现的目标,但至少是一种在两个“现实”之间传递价值的方式。

更新:几天前我在我的博客上发表了一篇文章,这可能有助于自适应对话,特别是在测试部分。


推荐阅读