如何将 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 示例。
我正在尝试将对象存储在机器人的用户数据中。
首先我有以下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 示例。