Session [“key”]的字符串扩展方法

时间:2011-03-05 17:33:11

标签: c# asp.net extension-methods

当我们访问Session["key"].ToString()时,它会在会话过期时发出异常&在编码中我们尝试访问会话变量。所以我正在尝试在object类上创建扩展方法,以便我可以在编码中将其写为Session["key"].getString(),这样每次我都不必执行Convert.ToString(session["key"])

任何其他解决方案也很明显。

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

只需使用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调用使其成为通用的其他可能的类型,它需要一个选择器然后使用lambdas:

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

我还建议使用属性。

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

答案 4 :(得分:0)

public static class ObjectExtensions
{
  public static string SafelyToString(this object o)
  {
     return o != null ? o.ToString() : string.Empty;
  }
}

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

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

答案 5 :(得分:0)

以下是在扩展方法中访问会话的简便方法:

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