Before we get started, let us see the general way to use Session in ASP.NET
if (Session["UserName"] == null) 
{ 
    LabelUserName.Text = "Anonymous"; 
} 
else 
{ 
    LabelUserName.Text = (string)Session["UserName"]; 
} 
You can feel some drawbacks e.g. to check null reference, type safety, to cast object..etc.
Now add following class and see how it solves the issues:
 public class SessionManager
    {
       
        public static T Get<T>(string key)
        {
             object sessionObject = HttpContext.Current.Session[key];
             if (sessionObject == null)
             {
                 return default(T);
             }
             return (T)HttpContext.Current.Session[key];
        }
        public static T Get<T>(string key, T defaultValue)
        {
            object sessionObject = HttpContext.Current.Session[key];
            if (sessionObject == null)
            {
                HttpContext.Current.Session[key] = defaultValue;
            }
            return (T)HttpContext.Current.Session[key];
        }
 
        public static void Save<T>(string key, T entity)
        {
            HttpContext.Current.Session[key] = entity;
        }
        public static void Remove(string key)
        {
            HttpContext.Current.Session.Remove(key);
        }
    }
It contains a few generic methods to read and write objects from/to the Session. You can use the above class in your ViewModel or Business Object (BO) to generate strongly typed property from the Session like below:
  public String UserName
        {
            get { return SessionManager.Get<String>("UserName", "Anonymous"); }
            set { SessionManager.Save<String>("UserName", value);  }
        }
        public Int32 UserId
        {
            get { return SessionManager.Get<Int32>("UserId", -1); }
            set { SessionManager.Save<Int32>("UserId", value); }
        }
The Initial example can be written in following way:
LabelUserName.Text = SessionManager.Get<String>("UserName", "Anonymous");
OR
LabelUserName.Text = MyViewModel.UserName;
You can see how simple it is.
In this post, we created a generic version of getting and setting Session objects and created strongly typed properties using it.
Hope, It helps. Feel free to share your opinion in comment box.
