C# 是否可以获取当前对话框步骤名称?
我正在写一个机器人,我想创建一个逐步帮助系统。我设置了一个字典,允许每个对话框覆盖其中每个步骤的帮助文本:C# 是否可以获取当前对话框步骤名称?,c#,botframework,C#,Botframework,我正在写一个机器人,我想创建一个逐步帮助系统。我设置了一个字典,允许每个对话框覆盖其中每个步骤的帮助文本: public abstract class BaseDialog : ComponentDialog { private static Dictionary<string, string> StepHelp = new Dictionary<string, string>(); protected static void AddStepHelp(st
public abstract class BaseDialog : ComponentDialog
{
private static Dictionary<string, string> StepHelp = new Dictionary<string, string>();
protected static void AddStepHelp(string function, string text)
{
StepHelp.Add(function, text);
}
private async Task<DialogTurnResult> InterruptAsync(DialogContext innerDc, CancellationToken cancellationToken)
{
Activity helpMessage;
string curStepName = ""; //???
if (userText == "help" && StepHelp.ContainsKey(curStepName))
{
helpMessage = MessageFactory.Text(StepHelp[curStepName], StepHelp[curStepName], InputHints.ExpectingInput);
}
await innerDc.Context.SendActivityAsync(helpMessage, cancellationToken);
}
}
公共抽象类BaseDialog:ComponentDialog
{
私有静态字典StepHelp=newdictionary();
受保护的静态void AddStepHelp(字符串函数、字符串文本)
{
添加(函数、文本);
}
专用异步任务中断异步(DialogContext innerDc,CancellationToken CancellationToken)
{
活动帮助信息;
字符串curStepName=“;/?”???
if(userText==“help”&&StepHelp.ContainsKey(curStepName))
{
helpMessage=MessageFactory.Text(StepHelp[curStepName]、StepHelp[curStepName]、inputInts.ExpectingInput);
}
等待innerDc.Context.SendActivityAsync(帮助消息,取消令牌);
}
}
然后在chidl对话框中添加文本:
public class MyChildDialog: BaseDialog
{
static MyChildDialog()
{
AddStepHelp(nameof(Step1), "Help text for step1");
}
public MyChildDialog()
{
AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[]
{
Step1
}));
InitialDialogId = nameof(WaterfallDialog);
}
private async Task<DialogTurnResult> Step1(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
}
}
公共类MyChildDialog:BaseDialog
{
静态MyChildDialog()
{
AddStepHelp(名称(步骤1),“步骤1的帮助文本”);
}
公共MyChildDialog()
{
AddDialog(新建WaterWallDialog)(名称(WaterWallDialog),新建WaterWallStep[]
{
步骤1
}));
InitialDialogId=nameof(WaterWallDialog);
}
专用异步任务Step1(WaterWallStepContext stepContext,CancellationToken CancellationToken)
{
}
}
您可以在上面的InterruptAsync函数中看到,我调用字典以获取基本对话框中的帮助消息,但如何获取当前步骤名称?您可以获取当前步骤索引以及对话框名称,因此您应该能够从该信息中创建唯一标识符(只要您没有像我一样将示例中的所有对话框命名为“WaterWallDialog!”。我使用的是node,但我假设从stepContext获取的数据类似或相同
- 对话框名称位于
stepContext.stack[stepContext.stack.length-1].id
- 步骤索引位于
stepContext.stack[stepContext.stack.length-1].state.stepContext
stepContext.stack.length-1
在任何情况下都应该工作。如果当前对话框位于元素0,显然您可以直接访问它
只要您的瀑布对话框名称是唯一的,您就可以得到像WaterWallDialog0、WaterWallDialog1等标识符,然后您可以在字典中映射这些标识符来帮助文本
我突然想到,您可能正试图从瀑布式对话框外部访问它。在这种情况下,您仍然可以从外部对话框上下文中获取它。您可能需要使用递归函数来获取它,例如
getInnermostActiveDialog(dc){
var child=dc.child;
返回子对象?this.getInnermostActiveDialog(子对象):dc.activeDialog;
}
其中,
dc
是您的外部对话框上下文。我没有深入讨论过,但是您应该能够获得相同的id
和stepIndex
值。您可以获得当前步骤索引以及对话框名称,因此您应该能够从该信息中创建唯一标识符(只要您没有像我一样将示例中的所有对话框命名为“WaterWallDialog!”。我使用的是node,但我假设从stepContext获取的数据类似或相同
- 对话框名称位于
stepContext.stack[stepContext.stack.length-1].id
- 步骤索引位于
stepContext.stack[stepContext.stack.length-1].state.stepContext
stepContext.stack.length-1
在任何情况下都应该工作。如果当前对话框位于元素0,显然您可以直接访问它
只要您的瀑布对话框名称是唯一的,您就可以得到像WaterWallDialog0、WaterWallDialog1等标识符,然后您可以在字典中映射这些标识符来帮助文本
我突然想到,您可能正试图从瀑布式对话框外部访问它。在这种情况下,您仍然可以从外部对话框上下文中获取它。您可能需要使用递归函数来获取它,例如
getInnermostActiveDialog(dc){
var child=dc.child;
返回子对象?this.getInnermostActiveDialog(子对象):dc.activeDialog;
}
其中,
dc
是您的外部对话框上下文。我没有深入讨论过这些内容,但是您应该能够获得相同的id
和stepIndex
值。虽然像billoverton解释的那样很容易获得步骤索引,但获取步骤名称却很困难。该字段是私有的,因此您无法获取即使你的类来源于字典
,但使用列表