无法将类型为“ System.String”的对象转换为类型为“ AuthBotES.ReturnIntents”的对象

时间:2019-06-25 04:04:23

标签: botframework luis azure-bot-service

当前,我已将LUIS与Bot Framework v4集成。

当我搜索具有Intent的结果时,

机器人返回此错误:

错误:无法将类型为“ System.String”的对象转换为类型为“ AuthBotES.ReturnIntents”。

enter image description here 我的源代码如下:

   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; }
    }

1 个答案:

答案 0 :(得分:0)

这里有几个问题:

  1. 您发布的第一个代码块看起来是用于处理对话框的结果,而不是是用于处理LUIS结果的。
  2. stringReturnIntents的投射将始终失败。
  3. 即使将stepContext.Result强制转换为ReturnIntents确实有效,您的msg变量也将仅包含namespace.to.class.ReturnIntents(对象类型的字符串表示形式 not 对象属性的字符串表示形式。
  4. 您的msg变量是多余的。

我将按照它们出现的顺序进行处理。


1-错误的代码块

此代码块看起来可疑地类似于用于process a dialoghere的代码,例如:

var result = (bool)stepContext.Result;

而不是handling a LUIS result的代码,例如:

var dispatchResult = await cognitiveModels.DispatchService.RecognizeAsync(dc.Context, CancellationToken.None);

2-投放错误

该错误告诉您它不知道如何将string对象转换为ReturnIntents对象。要将字符串转换为对象,可以使用两种方法:

  1. 使用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且已定义的hereExecuteLuisQuery方法返回一个ReturnIntents对象。

此对象作为option传递到ReturnIntentDialog here。由于这是作为object类型的实例而来的,因此您在FinalStepAsync方法here内有一些选项,可以将选项对象变成ReturnIntents对象。:

  1. 铸造
ReturnIntents returnIntents = null;

if (stepContext.Options is ReturnIntents)
{
    returnIntents = (ReturnIntents)stepContext.Options;
}
  1. 反序列化
using Newtonsoft.Json;

ReturnIntents returnIntents = null;

if (stepContext.Options is ReturnIntents)
{
    returnIntents = JsonConvert.DeserializeObject<ReturnIntents>(JsonConvert.SerializeObject(stepContext.Options));
}