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



放置在会话中:

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"];

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

您要

在此处向会话添加列表:

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);

最新更新