我正在尝试在对话框中存储一些数据,以便可以在多个对话框中使用该值来验证和控制流。我有Root Dialog,它将消息转发给Luis Dialog - 我在context.PrivateConversation 中设置了值,只要存储的数据是string或int 类型,它就可以工作。但是,我想存储一个对象 - 当我尝试这样做时 - 在get期间,我总是得到对象属性的默认值,而不是最初设置的值。对象实例的类是同一项目中不同命名空间下的Serializable类。
Luis Dialog - 设置数据 - 当我在此处设置数据时,对象响应具有大多数属性的值。
public async Task Help(IDialogContext context, LuisResult result)
{
IList<EntityRecommendation> entities = Utility.GetSorttedEntity(result.Entities);
HelpContext response = getresponse(entities[0].Type, entities);
string message = response.Responsemessage;
HelpContext cx = null;
if (!context.PrivateConversationData.TryGetValue<HelpContext>("HC", out cx))
{
context.PrivateConversationData.SetValue<HelpContext>("HC", response);
}
await this.ShowLuisResult(context, message);
}
根对话 - 获取数据 这里helpcontext的所有属性都为null,错误为iserror。
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
{
HelpContext helpContext = null;
if (!context.PrivateConversationData.TryGetValue<HelpContext>("HC", out helpContext))
{
var activity = await result as Activity;
await context.Forward(new BasicLuisDialog(), ResumeAfterLuisDialog, activity, CancellationToken.None);
}
context.Wait(this.MessageReceivedAsync);
}
HelpContext类
[Serializable]
public class HelpContext
{
internal string Product { get; set; }
internal string Errorcode { get; set; }
internal string Action { get; set; }
internal bool Iserror { get; set; }
internal string Responsemessage { get; set; }
}
所以 - 我不确定我在这里做错了什么。或者是 - 我不能使用对象存储私人会话数据?
谢谢!
答案 0 :(得分:3)
在使用字符串值进行初步实验后,我开始使用词典进行测试 - 这也是有效的,我期待它失败。这让我措手不及,也让我意识到还有其他基本的东西我和#39;我失踪了。我再次回到HelpContext类来查看我可能错过的内容 - 显然问题在于访问修饰符 - 当我从&#34;内部&#34;更改了HelpContext属性时。对于&#34; public&#34;,一切都按照我期望的方式开始工作。由于在调试期间可以访问这些值,因此没有及早发现它。
旧代码:
[Serializable]
public class HelpContext
{
internal string Product { get; set; }
internal string Errorcode { get; set; }
internal string Action { get; set; }
internal bool Iserror { get; set; }
internal string Responsemessage { get; set; }
}
新守则:
[Serializable]
public class HelpContext
{
public string Product { get; set; }
public string Errorcode { get; set; }
public string Action { get; set; }
public bool Iserror { get; set; }
public string Responsemessage { get; set; }
}