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

时间:2017-01-13 16:00:23

标签: c# bots botframework luis

我正在尝试将对象存储在Bot的UserData中。

首先,我有以下课程:

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

在我的Luis类中,我需要一个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对象为空。 我已经仔细检查过userName是否为空。

我错过了什么?

提前致谢!

1 个答案:

答案 0 :(得分:4)

如果您使用UserData,为什么需要在对话框中添加变量?

如果您想拥有变量,则PersonalData必须是可序列化的,因此您需要将[Serializable]属性添加到该类中。

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

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

我认为代码应该是:

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

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