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解释的那样很容易获得步骤索引,但获取步骤名称却很困难。该字段是私有的,因此您无法获取即使你的类来源于WaveSudio,步骤名称也只能通过遥测客户端公开,所以你可以考虑编写一个自定义的遥测客户端,以某种方式将信息暴露给你的BOT,但是在那个时候,使用反射来访问私有成员可能更容易。 由于您只希望步骤名称用作字典的键,因此只使用步骤索引是更好的选择。您可以使用
字典
,但使用
列表