代码之家  ›  专栏  ›  技术社区  ›  Kai

如何在C#中转换会话中存储的词典?

  •  1
  • Kai  · 技术社区  · 6 年前

    正在进行会话:

    HttpContext.Current.Session.Add("_ProjectRights", ProjectRepository.GetProjectRechten(user1.UserId).ToList());
    

    查询:

    var data= Db.Users.SingleOrDefault(s => s.UserPk == userId)?.ProjectUser
     .Select(se => new { Key = se.primaryKey1.ToString(), 
    Items = string.Join(",", se.ProjectRight.Select(sel => sel.primaryKey2).ToList()) });
    
    IDictionary<string, string> dictionary = data.ToDictionary(pair => pair.Key, pair => pair.Items);
    

    失败的强制转换:

    var privilegeLevelsDict = (Dictionary<string, List<string>>)HttpContext.Current.Session["_ProjectRechten"];
    

    成功施放:

    var privilegeLevelsDict = (List<KeyValuePair<string, List<string>>>)HttpContext.Current.Session["_ProjectRechten"];
    

    为什么第一组演员不起作用?为什么我必须转换到KeyValuePairs列表而不是字典,即使我首先在会话变量中放置了一个字典?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Jon Skeet    6 年前

    您正在将列表添加到会话中,如下所示:

    HttpContext.Current.Session.Add(
        "_ProjectRights", 
        ProjectRepository.GetProjectRechten(user1.UserId).ToList())
    

    请注意 ToList() 呼叫如果 GetProjectRechten 正在归还一本词典 希望 要在会话中(如果可以序列化),您可以删除 ToList() 呼叫

    HttpContext.Current.Session.Add(
        "_ProjectRights",
        ProjectRepository.GetProjectRechten(user1.UserId))
    

    如果无法序列化词典,但希望稍后重新创建词典,则可以轻松地执行以下操作:

    var storedValue = HttpContext.Current.Session["_ProjectRechten"];
    var list = (List<KeyValuePair<string, List<string>>>) storedValue;
    var dictionary = list.ToDictionary(pair => pair.Key, pair => pair.Value);
    
    推荐文章