【问题标题】:string extension method for Session["key"]Session["key"] 的字符串扩展方法
【发布时间】:2011-07-09 11:54:18
【问题描述】:

有时当我们访问Session["key"].ToString() 时,它会在会话过期时出现异常,并且在编码中我们尝试访问会话变量。所以我试图在object类上创建扩展方法,这样我就可以在编码中将它写成Session["key"].getString(),这样每次我都不必做Convert.ToString(session["key"])

任何其他的解决方案也是可以理解的。

【问题讨论】:

    标签: c# asp.net extension-methods


    【解决方案1】:

    下面是扩展方法中访问Session的简单方法:

    var loggedUser = (User)System.Web.HttpContext.Current.Session["User"]; 
    

    【讨论】:

      【解决方案2】:
      public static class ObjectExtensions
      {
          public static string GetString(this object o)
          {
              if (o == null)
              {
                  return string.Empty;
              }
              return Convert.ToString(o);
          }
      }
      

      然后:

      string value = Session["key"].GetString();
      

      或检查这个:

      public static class SessionExtensions
      {
          public static string GetString(this HttpSessionStateBase session, string key)
          {
              if (session == null)
              {
                  return string.Empty;
              }
              var value = session[key];
              if (value == null)
              {
                  return string.Empty;
              }
              return Convert.ToString(value);
          }
      }
      

      然后:

      string value = Session.GetString("key");
      

      【讨论】:

        【解决方案3】:

        只需使用 null-coalescing 运算符:

        string value = (session["key"] ?? String.Empty).ToString();
        

        更新
        如果您必须有一种方法来执行此操作(扩展或其他方式),我会执行以下操作:

        public static string GetValue(this HttpSessionState session, string key)
        {
           // TODO: Insert appropriate error checking here.
        
           return (session[key] ?? String.Empty).ToString();
        }
        

        我什至可以通过 GetValue 调用来使其对其他可能的类型具有通用性,该调用采用选择器,然后使用 lambda:

        public static T GetValue<T>(this HttpSessionState session, string key, Func<object, T> valueSelector)
        {
            return valueSelector(session[key]);
        }
        
        public static string GetStringValue(this HttpSessionState session, string key)
        {
            return session.GetValue(key, x => (x ?? String.Empty).ToString());
        }
        

        然后你会使用如下:

        string value = session.GetStringValue("key");
        

        【讨论】:

        • 这可行,但最好使用扩展方法,因为整个编写此代码可能很麻烦且重复。
        • yates 能否提供有关如何使用上述通用扩展方法的简短信息。
        【解决方案4】:

        我还建议为此使用属性。

        protected YourType PropertyName
        {
          get 
          {
            if(Session["Sessionname"] != null)
            {
              return Session["Sessionname"] as YourType;
            }
            YourType newItem = new YourType();
            // set vars
            Session["Sessionname"] = newItem;
            return newItem;
          }
          set
          {
           Session["Sessionname"] = value;
          }
        }
        

        如您所见,我选择protected 作为访问修饰符。如果你愿意,你可以把它放在public class 中,然后将属性设为static

        或者您可以使用派生自 System.Web.UI.Page 的类。

        public class MyCustomBaseClass : System.Web.UI.Page
        {
           protected YourType PropertyName
           {
            // get and set like above
            }
        }
        

        现在您可以将内容页面中的继承从System.Web.UI.Page 替换为MyCustomBaseClass,并且可以轻松调用this.PropertyName

        【讨论】:

        • 它可能会提供存储对象或对象列表的选项,或者意味着会话中的任何数据类型?
        • @Harsh:每种可序列化的数据类型。我的回答没有用吗?
        • 您的回答也很有用,但@Jeff Yates 的回答更简单简短,这就是我接受他回答的原因。
        【解决方案5】:
        public static class ObjectExtensions
        {
          public static string SafelyToString(this object o)
          {
             return o != null ? o.ToString() : string.Empty;
          }
        }
        

        这将允许Session["key"].SafelyToString()

        但是,您将无法区分会话变量中的空字符串和过期会话。

        【讨论】:

          【解决方案6】:

          也许这可以作为替代方案?

          object oKey = session["key"] ?? String.Empty;
          string sKey = (string)oKey;
          

          string sKey = session["key"] == null ? String.Empty : (string)session["key"]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-04-17
            • 2017-03-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-06
            • 2010-12-13
            • 2022-01-05
            相关资源
            最近更新 更多