如何将 UserData 存储在 Bot 的复杂对象中

How to store UserData in complex object in a Bot

我正在尝试将对象存储在机器人的用户数据中。

首先我有以下class:

public class PersonalData 
{
    public string Name { get; set; }
    public int Age { get; set; } 
}

在我的 Luis Class 中,我需要一个 PersonalData 类型的变量。

public class Luis : LuisDialog<object> 
{
    PersonalData personalData;

这已经导致调试器永远不会进入我的任何意图的问题。这有什么问题吗?

现在,如果我按照这样的意图创建一个 PersonalData 对象:

PersonalData personalData = new PersonalData();

将创建成功。 但是当我想为我的对象赋值时

if (!context.UserData.TryGetValue(ContextConstants.personalData, out personalData)) 
{
        personalData.Name = userName;
        context.UserData.SetValue(ContextConstants.personalData, personalData.Name);
}

一旦程序尝试将 personalData.Name 设置为 userName,我就会得到一个 NullReferenceException 并且我的 PersonalData 对象为空。 我仔细检查过用户名不为空。

我错过了什么?

提前致谢!

如果您使用的是 UserData,为什么您的对话框中需要有一个变量?

如果你想有一个变量,你的 PersonalData 必须是可序列化的,所以你需要将 [Serializable] 属性添加到 class.

但您不应在对话框中保存变量,而应始终访问将保存在 UserData 包中的 PersonalData 对象。

现在,当您设置值时,您只保存名称而不是保存整个对象,因此当您从 UserData 包中检索个人数据时,您检索的是名称,而不是对象,这就是你得到 NullReferenceException 的原因,因为 personalData.Name 不存在。

我认为代码应该是:

if (!context.UserData.TryGetValue(ContextConstants.personalData, out personalData)) 
{
        personalData.Name = userName;
        context.UserData.SetValue(ContextConstants.personalData, personalData);
}

要了解有关状态的更多信息,您还可以查看 this 示例。