Botframework从可重用对话框动态调用对话框

时间:2017-10-31 09:07:17

标签: c# botframework

比方说,我们有一个LoginDialog(可重复使用的对话框),可以在不同的时间调用,以访问机器人的特定区域/对话框。

作为可重用的对话框,您不希望编写显式调用子对话框。

public class LoginDialog : IDialog<object> {

public async Task StartAsync(IDialogContext context) {
    var message = "Insert password";

    PromptDialog.Text(context, AfterPassword,
            message,
            null,
            1);
}

public async Task AfterPassword(IDialogContext context, IAwaitable<string> result) {
        var password = await result;
        var valid = await Mocks.ValidatePasswordMockAsync(password);

        if (valid) {
    context.Call(new TheDialog(), ResumeAfter);
        } else context.Call(new TransferDialog(), ResumeAfter);
    }

private async Task ResumeAfter(IDialogContext context, IAwaitable<object> result) {
        context.Done<object>(null);
    }}

也许您有多个需要登录验证的对话框。

您想要做的是使用反射来重用该对话框?

我试过这样的事情:

public class LoginDialog : IDialog<object> {

    private string classToCall;

    public LoginDialog(string classToCall) {
        this.classToCall = classToCall;
    }

    public async Task StartAsync(IDialogContext context) {
        var message = "Insert password";

        PromptDialog.Text(context, AfterPassword, message, null, 1);
    }

    public async Task AfterPassword(IDialogContext context, IAwaitable<string> result) {
        var password = await result;
        var valid = await Mocks.ValidatePasswordMockAsync(password);

        if (valid) {
            var type = Type.GetType(classToCall);
            context.Call(Activator.CreateInstance(type), ResumeAfter);
        } 
        else 
            context.Call(new TransferDialog(), ResumeAfter);
    }

    private async Task ResumeAfter(IDialogContext context, IAwaitable<object> result) {
        context.Done<object>(null);
    }
}

我在这一行收到错误:

context.Call(Activator.CreateInstance(type), ResumeAfter);
  

无法从用法中推断出类型参数。尝试显式指定类型参数。

你推荐什么?强制演员(IDialog<object>)?

1 个答案:

答案 0 :(得分:2)

而不是将下一个对话框的责任委托给LoginDialog,如果LoginDialog有效或无效,则不会让Type.GetType返回。来电者决定接下来打电话给谁?

关于您的问题,首先,检查+-----+------------+-------------+-----------+---------------------------------+ | dbg | prod | nostore | buildType | resulting variant | +-----+------------+-------------+-----------+---------------------------------+ | dbg | production | nostoreprod | debug | dbgProductionNostoreprodDebug | | dbg | production | nostoreprod | release | dbgProductionNostoreprodRelease | +-----+------------+-------------+-----------+---------------------------------+ 是否正在返回您的预期,然后是,尝试投放以查看问题是否存在或是否还有其他问题。