C# 如何在机器人的复杂对象中存储用户数据

C# 如何在机器人的复杂对象中存储用户数据,c#,bots,botframework,azure-language-understanding,C#,Bots,Botframework,Azure Language Understanding,我试图在机器人的UserData中存储一个对象 首先,我有以下课程: public class PersonalData { public string Name { get; set; } public int Age { get; set; } } 在我的Luis类中,我需要PersonalData类型的变量 public class Luis : LuisDialog<object> { PersonalData personalData; 它

我试图在机器人的UserData中存储一个对象

首先,我有以下课程:

public class PersonalData 
{
    public string Name { get; set; }
    public int Age { get; set; } 
}
在我的Luis类中,我需要PersonalData类型的变量

public class Luis : LuisDialog<object> 
{
    PersonalData personalData;
它将成功创建。 但是当我想给我的对象赋值时

if (!context.UserData.TryGetValue(ContextConstants.personalData, out personalData)) 
{
        personalData.Name = userName;
        context.UserData.SetValue(ContextConstants.personalData, personalData.Name);
}
只要程序尝试将personalData.Name设置为userName,我就会得到一个NullReferenceException,并且我的personalData对象为null。 我仔细检查了用户名是否为空

我错过了什么

提前谢谢

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

如果您想要有一个变量,您的PersonalData必须是可序列化的,因此您需要将[serializable]属性添加到类中

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

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

我认为守则应该是:

if (!context.UserData.TryGetValue(ContextConstants.personalData, out personalData)) 
{
        personalData.Name = userName;
        context.UserData.SetValue(ContextConstants.personalData, personalData);
}
要了解有关状态的更多信息,还可以查看示例。

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

如果您想要有一个变量,您的PersonalData必须是可序列化的,因此您需要将[serializable]属性添加到类中

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

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

我认为守则应该是:

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

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

我必须在IF语句之后初始化PersonalData对象,如下所示:PersonalData=new PersonalData;我发现,如果函数TryGetValue失败,out值就会设置为null。这就是为什么必须首先初始化对象变量,然后设置任何值;我发现,如果函数TryGetValue失败,out值就会设置为null。这就是为什么必须首先初始化对象变量,然后设置任何值。