【问题标题】:How to store UserData in complex object in a Bot如何将 UserData 存储在 Bot 中的复杂对象中
【发布时间】:2017-01-13 16:00:23
【问题描述】:

我正在尝试将对象存储在 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 不为空。

我错过了什么?

提前致谢!

【问题讨论】:

    标签: c# bots botframework azure-language-understanding


    【解决方案1】:

    如果您使用的是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);
    }
    

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

    【讨论】:

    • 我必须像这样在 IF 语句之后初始化我的 PersonalData 对象:personalData = new PersonalData();然后它与您的解决方案配合得很好。
    • 我发现,如果函数“TryGetValue”失败,则输出值设置为空。这就是为什么必须先初始化对象变量,然后设置任何值的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2011-11-05
    • 2019-05-11
    相关资源
    最近更新 更多