当我们访问Session["key"].ToString()
时,它会在会话过期时发出异常&在编码中我们尝试访问会话变量。所以我正在尝试在object
类上创建扩展方法,以便我可以在编码中将其写为Session["key"].getString()
,这样每次我都不必执行Convert.ToString(session["key"])
任何其他解决方案也很明显。
答案 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"];