【问题标题】:How to access dynamic object stored in session如何访问存储在会话中的动态对象
【发布时间】:2014-02-15 08:27:28
【问题描述】:

在 PHP 中,我们可以在会话中存储/访问关联数组。 我如何使用 asp.net mvc4 访问它们。

我已经在会话中设置了变量,例如:

Session["User"] = new { UserName = "abc", Email= "a@a.com", UserType="User" };

我需要一些机制来访问像用户名表单会话“用户”这样的值-

string user = Session["User"]["UserName"]

有什么想法吗?

【问题讨论】:

    标签: asp.net asp.net-mvc-4 session


    【解决方案1】:

    在您的示例中,您在会话中放置的不是动态对象,而是匿名类的实例。然而,这不起作用,因为为了在从会话中读取对象时访问对象的属性,您必须将其转换为正确的类型,在本例中为匿名类。由于您不知道匿名类的名称(这就是它是匿名的原因),因此您不能执行此转换。 解决方法有以下三种:

    1. 使用命名类
    2. 使用字典
    3. 使用动态对象

    1。使用命名类

    这个真的很简单,只需要创建一个类(或结构体)就可以了:

    public class UserData {
      public string UserName {get; set;}
      public string Email {get; set;}
      public string UserType {get; set;}
    }
    

    然后使用该类的实例将数据存储在会话中:

    Session["User"] = new UserData {UserName = "abc", Email= "a@a.com", UserType="User"};
    

    并像这样访问它:

    var user = (UserData)Session["User"]; 
    var userName = user.UserName;
    

    在这种情况下,您失去了“活力”,因为您必须预先声明所有属性,但您会得到一些编译时间检查作为回报,这是一件好事。除非有很好的理由存储动态值,否则我会选择这个解决方案。

    2。使用字典

    在这里,您在会话中存储Dictionary<string, string>

    Session["User"] = new Dictionary<string, string> {{"UserName", "abc"}, {"Email", "a@a.com"}, {"UserType", "User"} };
    

    并访问它:

    var userDict = (Dictionary<string, string>)Session["User"];
    var userName = userDict["UserName"];
    

    3。使用动态对象

    这与使用字典没有什么不同,因为它不提供编译时类型检查,但提供了更好的语法。

    dynamic userData = new ExpandoObject();
    userData.UserName = "abc";
    userData.Email = "a@a.com";
    userData.UserType = "User";
    Session["User"] = userData;
    

    或者,正如@James 在评论中指出的那样,您也可以在此处使用匿名类型,就像您在原始示例中使用的那样:

    Session["User"] = new {UserName="abc", Email="a@a.com", UserType="User"};
    

    并访问它:

    dynamic userData = Session["User"];
    var userName = userData.UserName;
    

    【讨论】:

    • 使用字典和动态有什么区别吗? Session 的最佳做法是什么?
    • 正如我所写的,我真的会使用命名类解决方案来获得编译时类型检查的好处。其他两种解决方案之间的区别实际上只是语法上的,因为 ExpandoObject 在内部使用 Dictionary 来存储值。
    • @csgero 使用dynamic 对象,您无需显式创建ExpandoObject。您可以通过创建匿名类型并简单地转换为 dynamic 来使用 OP 已经拥有的代码。
    【解决方案2】:

    您已经创建了一个匿名对象,因此您应该能够将其直接转换为 dynamic

    string user = ((dynamic)Session["User"]).UserName;
    

    【讨论】:

      【解决方案3】:

      您可以使用字典:Dictionary&lt;string, string&gt;Dictionary&lt;string, object&gt;

      var user = new Dictionary<string, string>();
      user.Add("UserName", "abc");
      user.Add("Email", "a@a.com");
      user.Add("UserType", "User");
      Session["User"] = user;
      

      并使用它:

      string user = ((Dictionary<string, string>)Session["User"])["UserName"];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-22
        相关资源
        最近更新 更多