Невозможно привести объект типа «System.String» к типу «AuthBotES.ReturnIntents». - PullRequest
0 голосов
/ 25 июня 2019

В настоящее время я интегрировал LUIS с Bot Framework v4.

Когда я ищу совпадение результата с намерением,

Бот возвращает меня с этой ошибкой:

Ошибка: невозможно привести объект типа «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 голосов
/ 25 июня 2019

Несколько проблем здесь:

  1. Первый блок кода, который вы опубликовали, выглядит для обработки результата диалога, не для обработки результата LUIS.
  2. Приведение с string на ReturnIntents всегда будет неудачным.
  3. Даже если ваше приведение с stepContext.Result на ReturnIntents сработало, ваша переменная msg будет содержать только namespace.to.class.ReturnIntents (строковое представление типа объекта, не строковое представление свойств объекта.
  4. Ваша переменная msg является избыточной.

Я рассмотрю этив порядке их появления.


1 - Неверный блок кода

Этот блок кода выглядит подозрительно, как код, используемый для обработки диалога и здесь например:

var result = (bool)stepContext.Result;

Вместо кода для обработки результата LUIS Например:

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

2 - Ошибка приведения

Ошибка говорит вам, что она не знает, как преобразовать объект string в объект ReturnIntents.преобразовать строку в ваш объект вы можете использовать несколько методов:

  1. Используйте пакет NuGet NewtonSoft.Json, чтобы позволить вам превратить строку JSON в ваш объект, как объяснено здесь ,2) Определяемое пользователем преобразование типов, как описано в официальных документах здесь и объяснено в этого ответа .

Эта ошибка представляет собой красную сельдьс точки зрения вашего решения, потому что я считаю, что вы случайно скопировали в неправильный блок кода.


3 - неправильное поведение ToString

Toполучите строковое значение ReturnIntents, которое вам потребуется, чтобы переопределить метод 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

Метод ExecuteLuisQuery, называемый здесь , и определенный здесь возвращает объект ReturnIntents.

Thisобъект передается как option ReturnIntentDialog здесь .Поскольку это происходит как экземпляр типа object, у вас есть несколько опций внутри вашего FinalStepAsync метода здесь , чтобы превратить ваш объект опций в ReturnIntents объект .:

  1. Кастинг
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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...