Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 会话[“key”的字符串扩展方法_C#_Asp.net_Extension Methods - Fatal编程技术网

C# 会话[“key”的字符串扩展方法

C# 会话[“key”的字符串扩展方法,c#,asp.net,extension-methods,C#,Asp.net,Extension Methods,当我们访问会话[“key”]时,ToString()会在会话过期时出现异常&在编码过程中,我们尝试访问会话变量。所以我试图在对象上创建扩展方法类,这样我就可以在编码中把它写成会话[“key”].getString(),这样每次我就不必做转换.ToString(会话[“key”]) 任何其他解决方案都是值得考虑的 public static class ObjectExtensions { public static string GetString(this object o)

当我们访问会话[“key”]时,ToString()会在会话过期时出现异常&在编码过程中,我们尝试访问会话变量。所以我试图在
对象上创建扩展方法
类,这样我就可以在编码中把它写成
会话[“key”].getString()
,这样每次我就不必做
转换.ToString(会话[“key”])

任何其他解决方案都是值得考虑的

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();
string value = Session.GetString("key");
或者检查一下这个:

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["key"].GetString();
string value = Session.GetString("key");

也许这是一个替代方案

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


我还建议使用属性来实现这一点

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
作为访问修饰符。如果需要,可以将其放入
公共类中
,并使属性
为静态

或者您可以使用从
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

只需使用空合并操作符:

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());
}
这将允许
会话[“键]。SafelyToString()


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

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


这是可行的,但扩展方法更可取,因为编写这段代码可能会很麻烦且重复。yates您能否提供有关如何使用上述通用扩展方法的简短信息。它可能会提供存储对象或对象列表或表示会话中的任何数据类型的选项?@Harsh:所有可用的数据类型可序列化。我的答案有用吗?你的答案也有用,但@Jeff Yates的答案更简单、更简短,这就是我接受他的答案的原因。
public static class ObjectExtensions
{
  public static string SafelyToString(this object o)
  {
     return o != null ? o.ToString() : string.Empty;
  }
}
var loggedUser = (User)System.Web.HttpContext.Current.Session["User"];