我正在尝试将对象存储在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是否为空。
我错过了什么?
提前致谢!
答案 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示例。