c# - 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 !! ??
},
任何想法?提前致谢...
解决方案
只是为了设置一点上下文,您必须记住,自适应对话和传统对话存在于不同的领域,并且您以不同的方式使用它们。
您可以使用自适应对话框中的传统对话框,但您不能(或者至少我还没有弄清楚如何)以相反的方式进行操作。
自适应对话框是声明性的,由 管理,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);
}),
能够获取和设置属性并在“另一边”使用它们。
无论如何,我不确定这是否会达到您想要实现的目标,但至少是一种在两个“现实”之间传递价值的方式。
推荐阅读
- scala - 移除对具有 Unit 返回类型的函数的调用时出现奇怪的 Scala 编译器错误,这怎么可能?
- javascript - 无法访问数据请求 Axios、React-Redux
- html - 没有 JavaScript 的图像翻转
- python - 如何知道嵌套字典中的列表中是否存在值
- ruby-on-rails - 如何在 Docker 中运行 Rails?PG::ConnectionBad 无法将主机名“pg”转换为地址:没有与主机名关联的地址
- html - 当我不使用 flexbox 页面布局时,如何让页脚占据剩余的高度?
- c# - System.Reflection.TargetInvocationException :调用的目标已引发异常
- elixir - 如何根据属性组织结构列表
- java - PHP脚本在android中没有得到正确的值
- reactjs - TypeScript 2.8:在一次编译中执行和响应