当前,我已将LUIS与Bot Framework v4集成。
当我搜索具有Intent的结果时,
机器人返回此错误:
错误:无法将类型为“ System.String”的对象转换为类型为“ AuthBotES.ReturnIntents”。
if (stepContext.Result != null)
{
var result = (ReturnIntents)stepContext.Result;
var msg = $"{result}";
await stepContext.Context.SendActivityAsync(MessageFactory.Text(msg), cancellationToken);
}
和我的ReturnIntents类。
public class ReturnIntents
{
public string Intent { get; set; }
public double Score { get; set; }
public string Entities { get; set; }
}
答案 0 :(得分:0)
这里有几个问题:
string
到ReturnIntents
的投射将始终失败。stepContext.Result
强制转换为ReturnIntents
确实有效,您的msg
变量也将仅包含namespace.to.class.ReturnIntents
(对象类型的字符串表示形式 not 对象属性的字符串表示形式。msg
变量是多余的。我将按照它们出现的顺序进行处理。
1-错误的代码块
此代码块看起来可疑地类似于用于process a dialog和here的代码,例如:
var result = (bool)stepContext.Result;
而不是handling a LUIS result的代码,例如:
var dispatchResult = await cognitiveModels.DispatchService.RecognizeAsync(dc.Context, CancellationToken.None);
2-投放错误
该错误告诉您它不知道如何将string
对象转换为ReturnIntents
对象。要将字符串转换为对象,可以使用两种方法:
NewtonSoft.Json
NuGet包,可以按照here所述将JSON字符串转换为对象。
2)用户定义的类型转换,在官方文档here中有详细说明,并在this answer中进行了说明。就您的解决方案而言,此错误是一个麻烦,因为我认为您不小心将您复制到了错误的代码块中。
3-错误的ToString行为
要获取ReturnIntents
的字符串值,您将需要使用override the ToString类的方法并编写自己的自定义实现。
4-冗余投射
此:
// We know that this cast fails, and that stepContext.Result is a string
var result = (ReturnIntents)stepContext.Result;
// This will only return <namespace.path>.ReturnIntents (if the cast above works)
var msg = $"{result}";
// Passing in message msg isn't required, we can just pass in stepContext.Result
await stepContext.Context.SendActivityAsync(MessageFactory.Text(msg), cancellationToken);
成为:
var result = stepContext.Result;
await stepContext.Context.SendActivityAsync(MessageFactory.Text(result), cancellationToken);
所以我实际上认为您真正想要的是以下内容:
var dispatchResult = await cognitiveModels.DispatchService.RecognizeAsync<ReturnIntents>(dc.Context, CancellationToken.None);
这会将用户的输入发送到LUIS,并将响应反序列化为ReturnIntents
对象。
编辑以为OP提供解决方案
名为here且已定义的here的ExecuteLuisQuery
方法返回一个ReturnIntents
对象。
此对象作为option
传递到ReturnIntentDialog
here。由于这是作为object
类型的实例而来的,因此您在FinalStepAsync
方法here内有一些选项,可以将选项对象变成ReturnIntents
对象。:>
ReturnIntents returnIntents = null;
if (stepContext.Options is ReturnIntents)
{
returnIntents = (ReturnIntents)stepContext.Options;
}
using Newtonsoft.Json;
ReturnIntents returnIntents = null;
if (stepContext.Options is ReturnIntents)
{
returnIntents = JsonConvert.DeserializeObject<ReturnIntents>(JsonConvert.SerializeObject(stepContext.Options));
}