【问题标题】:get bool from IAwaitable<IMessageActivity>从 IAwaitable<IMessageActivity> 获取布尔值
【发布时间】:2017-05-26 03:32:22
【问题描述】:

ParseMessage 的确认提示将文本发送给 Luis,然后我返回 true 或 false。我已经在这个文件中设置了调试器,并且验证的响应返回 bool。

有问题的代码。当我得到结果时,它显示Cannot implicitly convert IAwaitable&lt;bool&gt; to bool,这就是Convert.ToBoolean() 的来源;然而仍然没有运气。

如何检查返回的布尔值,以便验证此 if 语句中的结果。

在当前的代码示例中,它只是在机器人模拟器中发回一条消息:

异常:无法将“Microsoft.Bot.Builder.Internals.Fibers.Wait`2[Microsoft.Bot.Builder.Dialogs.Internals.DialogTask,System.Boolean]”类型的对象转换为“System.IConvertible”类型.

编辑:更新更多代码

RootDialog.cs

    private async Task SendWelcomeMessageAsync(IDialogContext context)
    {
        await context.PostAsync("Hi, I'm the Basic Multi Dialog bot. Let's get started.");

        context.Call(new ConfirmLuisPrompt(), this.ConfirmLuisPromptAfter);
    }

    private async Task ConfirmLuisPromptAfter(IDialogContext context, IAwaitable<bool> result)
    {
        //var res = Convert.ToBoolean(result);
        var confirm = await result;

        if (confirm) 
        {
            //yes
            context.Call(FormDialog.FromForm(PersonInfo.BuildForm, FormOptions.PromptInStart), this.PersonInfoAfter);
        }else
        {
            //no
            await context.PostAsync($"Ok, let's get you started");

            context.Call(FormDialog.FromForm(PatientInfo.BuildForm, FormOptions.PromptInStart), InHospital);

        }
    }

确认LuisPrompt.cs

 [Serializable]
public class ConfirmLuisPrompt : IDialog<bool>
{
    public async Task StartAsync(IDialogContext context)
    {
        await context.PostAsync("Do you have insurance?");

        context.Wait(this.MessageReceivedAsync);
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {

        dynamic m = await result;
        var message = m.Text.ToString();
        //context.Wait( ParseMessage(context, message));
        bool response = await ParseMessage(message);
        context.Done(response);
        //context.PostAsync(response.toString());
    }


    public bool ParseMessage(string input)
    {
        LuisClient luisClient = new LuisClient("<key1>", "<key2>");
        Task<LuisResult> resultTask = luisClient.Predict(input);
        resultTask.Wait();
        LuisResult result = resultTask.Result;

        if (result.TopScoringIntent.Name == "Yes")
        {
            return true;
        }
        else if (result.TopScoringIntent.Name == "No")
        {
            return false;
        }
        else
        {
            return false;
        }
    }

}

【问题讨论】:

    标签: c# botframework


    【解决方案1】:

    您只需要在您的ConfirmLuisPromptAfter 方法中执行以下操作:

    var confirm = await result;
    
    if (confirm) 
    {
       ...
    }
    

    【讨论】:

    • Exception: ‘bool’ does not contain a definition for ‘GetAwaiter’ 这似乎很奇怪,因为它是一个 IAwaitable 哈哈
    • 我认为这个评论是为了另一个答案。
    • 那么您的代码中还有其他问题。请使用对话框的所有代码更新您的问题。
    【解决方案2】:

    不要转换只是做:result.GetAwaiter().GetResult() 应该返回一个布尔值

    【讨论】:

      猜你喜欢
      • 2016-07-08
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多