Несколько проблем здесь:
- Первый блок кода, который вы опубликовали, выглядит для обработки результата диалога, не для обработки результата LUIS.
- Приведение с
string
на ReturnIntents
всегда будет неудачным. - Даже если ваше приведение с
stepContext.Result
на ReturnIntents
сработало, ваша переменная msg
будет содержать только namespace.to.class.ReturnIntents
(строковое представление типа объекта, не строковое представление свойств объекта. - Ваша переменная
msg
является избыточной.
Я рассмотрю этив порядке их появления.
1 - Неверный блок кода
Этот блок кода выглядит подозрительно, как код, используемый для обработки диалога и здесь например:
var result = (bool)stepContext.Result;
Вместо кода для обработки результата LUIS Например:
var dispatchResult = await cognitiveModels.DispatchService.RecognizeAsync(dc.Context, CancellationToken.None);
2 - Ошибка приведения
Ошибка говорит вам, что она не знает, как преобразовать объект string
в объект ReturnIntents
.преобразовать строку в ваш объект вы можете использовать несколько методов:
- Используйте пакет 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
объект .:
- Кастинг
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));
}