从 IAwaitable<IMessageActivity> 获取布尔值
get bool from IAwaitable<IMessageActivity>
ParseMessage 的确认提示将文本发送给 Luis,然后我 return 判断真假。我在这个文件中设置了调试器并验证了响应 returns bool。
有问题的代码。当我得到结果时,它说 Cannot implicitly convert IAwaitable<bool> to bool
,这是 Convert.ToBoolean()
进来的地方;然而仍然没有运气。
如何检查 returned 布尔值,以便验证此 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);
}
}
ConfirmLuisPrompt.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;
}
}
}
不要转换只是做:result.GetAwaiter().GetResult()
应该 return 一个布尔值
您只需在 ConfirmLuisPromptAfter
方法中执行以下操作:
var confirm = await result;
if (confirm)
{
...
}
ParseMessage 的确认提示将文本发送给 Luis,然后我 return 判断真假。我在这个文件中设置了调试器并验证了响应 returns bool。
有问题的代码。当我得到结果时,它说 Cannot implicitly convert IAwaitable<bool> to bool
,这是 Convert.ToBoolean()
进来的地方;然而仍然没有运气。
如何检查 returned 布尔值,以便验证此 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);
}
}
ConfirmLuisPrompt.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;
}
}
}
不要转换只是做:result.GetAwaiter().GetResult()
应该 return 一个布尔值
您只需在 ConfirmLuisPromptAfter
方法中执行以下操作:
var confirm = await result;
if (confirm)
{
...
}