C#: Lagre objekt til cookie

No comments
 
    /// <summary>
    /// util for å serialize /deserialize objekter til cookies
    /// </summary>
    public static class CookieUtils
    {
 
        /// <summary>
        /// Henter satt cookie som object, returnerer null hvis cookie ikke finnes
        /// </summary>
        /// <param name="navn"></param>
        /// <returns></returns>
        public static T GetCookie<T>(string navn) where T : class, new()
        {
            StringReader stream;
 
            try
            {
 
                HttpCookie c = HttpContext.Current.Request.Cookies[navn];
                if (c == null || string.IsNullOrEmpty(c.Value))
                    return default(T);
 

                string[] verdier = c.Value.Split('|');
                int n = 0;
 
                T objekt = new T();
 
                Type type = objekt.GetType();
                //Type type = objekt.GetType();
                FieldInfo[] felter = type.GetFields();
                foreach (FieldInfo feltinf in felter)
                {
                    feltinf.SetValue(objekt, verdier[n++]);
                }
 
                PropertyInfo[] props = type.GetProperties();
                foreach (PropertyInfo propinf in props)
                {
                    SetProperty(propinf, verdier[n++], objekt);
                }
 
 
 
                return objekt;
            }
            catch (Exception ex)
            {
                throw new BasisException(ex);
            }
 

        }
        /// <summary>
        /// Lager cookie av gjeldende objekt som utløper om 10 timer
        /// </summary>
        /// <param name="navn"></param>
        /// <param name="objekt"></param>
        public static void SetCookie(string navn, object objekt)
        {
            SetCookie(navn, objekt, DateTime.Now.AddHours(10));
        }
 
        /// <summary>
        /// Lager cookie av gjeldende objekt
        /// </summary>
        /// <param name="navn"></param>
        /// <param name="objekt"></param>
        /// <param name="utløper"></param>
        public static void SetCookie(string navn, object objekt, DateTime utløper)
        {
 

            try
            {
 
                StringBuilder streng = new StringBuilder();
                Type type = objekt.GetType();
                FieldInfo[] felter = type.GetFields();
                foreach (FieldInfo feltinf in felter)
                {
                    if (feltinf != null)
                    {
                        object verdi = feltinf.GetValue(objekt);
                        streng.Append(verdi.ToString() + "|");
 
                    }
                }
 
                PropertyInfo[] props = type.GetProperties();
                foreach (PropertyInfo propinf in props)
                {
                    if (propinf != null)
                    {
                        object verdi = propinf.GetValue(objekt, null);
                        streng.Append(verdi.ToString() + "|");
                    }
                }
 
                HttpCookie c = new HttpCookie(navn, streng.ToString());
 
                c.Expires = utløper;
 
                if (HttpContext.Current.Request.Cookies[navn] != null)
                    //finnes fra før
                    HttpContext.Current.Response.Cookies.Set(c);
                else
                    //finnes ikke, lag ny
                    HttpContext.Current.Response.Cookies.Add(c);
 
            }
            catch (Exception ex)
            {
                throw new BasisException(ex);
            }
        }
 

        /// <summary>
        /// sletter en satt cookie
        /// (resetter verdi og setter utløpsdato tilbake i tid)
        /// </summary>
        /// <param name="navn"></param>
        public static void SlettCookie(string navn)
        {
            //tømmer verdi og setter utløpt for ett år siden
            HttpCookie c = new HttpCookie(navn, "");
            c.Expires = DateTime.Now.AddYears(-1);
 
            if (HttpContext.Current.Request.Cookies[navn] != null)
                //finnes fra før
                HttpContext.Current.Response.Cookies.Set(c);
 
        }
 

        /// <summary>
        /// Hjelpemetode for å sette en verdi via reflection etc
        /// </summary>
        /// <param name="pInfo"></param>
        /// <param name="propertyName"></param>
        /// <param name="propertyValue"></param>
        /// <param name="control"></param>
        /// <param name="objectToSetValue"></param>
        private static void SetProperty(PropertyInfo pInfo, string propertyValue, object objectToSetValue)
        {
            Type pType = pInfo.PropertyType;
 
            if (pType == typeof(string))
                pInfo.SetValue(objectToSetValue, propertyValue, null);
            else if (pType == typeof(bool))
                pInfo.SetValue(objectToSetValue, Convert.ToBoolean(propertyValue), null);
            else if (pType == typeof(int))
                pInfo.SetValue(objectToSetValue, Convert.ToInt32(propertyValue), null);
            else
                throw new NotImplementedException("Objektet har felttype som ikke er implementert enda..");
        }
    }
 
 

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment