/// <summary>
        /// Registra el fin de la ejecución de un método, guardando la fecha de termino, el valor de retorno y su tipo.
        /// Se debe logear antes de retornar. Requiere que se haya logeado el inicio del método.
        /// </summary>
        /// <example>
        ///     public int Sumar(int valor1, int valor2)
        ///     {
        ///         log.Inicio(valor1, valor2);
        ///         int resultado = valor1 + valor2;
        ///         log.Retorno(resultado);
        ///         return resultado;
        ///     }
        /// </example>
        /// <remarks>
        ///     Registro de versiones:
        ///
        ///         1.0 02/03/2015 Marcos Abraham Hernández Bravo (Ada Ltda.): versión inicial.
        /// </remarks>
        /// <param name="valor">Valor de retorno del método.</param>
        public void Retorno(object valor)
        {
            Llamada++;

            string valorJson = string.Empty;

            try
            {
                valorJson = JsonConverterFactory.ObtenerJsonConverter().ToJson(valor, true);
            }
            catch (Exception e)
            {
                valorJson = "Error al transformar a Json - " + e.Message;
            }

            RegistroInLineTO registro = new RegistroInLineTO()
            {
                ThreadGUID    = Log4MeManager.ThreadGUID,
                MethodGUID    = InstanciaLog.MethodGUID,
                Namespace     = InstanciaLog.Metodo.DeclaringType.Namespace,
                Clase         = InstanciaLog.Metodo.DeclaringType.Name,
                Metodo        = InstanciaLog.Metodo.ToString(),
                ValorVariable = valorJson,
                Correlativo   = Llamada,
                Tipo          = Tipo.Retorno
            };

            foreach (ALogWriter writer in Writers)
            {
                if (writer.PermiteTipo(Tipo.Retorno))
                {
                    writer.Guardar(registro);
                }
            }
        }
        private void Deserialize()
        {
            arbol_JSON.Nodes.Clear();
            JavaScriptSerializer js = new JavaScriptSerializer();

            try
            {
                TreeNode rootNode = new TreeNode("Parametros");
                arbol_JSON.Nodes.Add(rootNode);

                foreach (ParametroTO parametro in Sesion.MetodoActual.Parametros)
                {
                    TreeNode nodoParametro = new TreeNode(string.Format("[{0}]", parametro.Nombre));
                    rootNode.Nodes.Add(nodoParametro);
                    IJsonConverter converter = JsonConverterFactory.ObtenerJsonConverter();
                    try
                    {
                        parametro.Valor = converter.ToObject(parametro.Valor.ToString(), true);
                    }
                    catch { }

                    Dictionary <string, object> dic = js.Deserialize <Dictionary <string, object> >(converter.ToJson(parametro));
                    BuildTree(dic, nodoParametro);
                }
            }
            catch (ArgumentException)
            {
                MessageBox.Show("JSON data is not valid", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
        /// <summary>
        /// Registra la información relevante de una excepción lanzada por un método. Se debe logear antes de ser lanzada.
        /// Requiere que el inicio y el retorno del método esté logeado.
        /// </summary>
        /// <remarks>
        ///     Registro de versiones:
        ///
        ///         1.0 02/03/2015 Marcos Abraham Hernández Bravo (Ada Ltda.): versión inicial.
        /// </remarks>
        /// <param name="excepcion">Excepción lanzada.</param>
        /// <param name="permiteContinuar">Valor que indica si la excepción interrumpe el flujo (no permite continuar).
        /// En caso de ser falso, se logea automáticamente el retorno del método como Excepción.</param>
        public void Excepcion(Exception excepcion, bool permiteContinuar)
        {
            Llamada++;

            string valorJson = string.Empty;

            try
            {
                valorJson = JsonConverterFactory.ObtenerJsonConverter().ToJson(excepcion.Data, true);
            }
            catch (Exception ex)
            {
                valorJson = "Error al transformar a Json - " + ex.Message;
            }

            RegistroInLineTO registro = new RegistroInLineTO()
            {
                ThreadGUID    = Log4MeManager.ThreadGUID,
                MethodGUID    = InstanciaLog.MethodGUID,
                Namespace     = InstanciaLog.Metodo.DeclaringType.Namespace,
                Clase         = InstanciaLog.Metodo.DeclaringType.Name,
                Metodo        = InstanciaLog.Metodo.ToString(),
                StackTrace    = excepcion.StackTrace,
                Data          = valorJson,
                TipoExcepcion = excepcion.GetType().FullName,
                Mensaje       = excepcion.Message,
                Correlativo   = Llamada,
                Tipo          = Tipo.Excepcion
            };

            foreach (ALogWriter writer in Writers)
            {
                if (writer.PermiteTipo(Tipo.Excepcion))
                {
                    writer.Guardar(registro);
                }
            }

            if (!permiteContinuar)
            {
                Retorno("<" + registro.Tipo + ">");
            }
        }
        private void Deserialize()
        {
            Sesion.ExcepcionActual = Sesion.MetodoActual.Excepcion;

            if (Sesion.ExcepcionActual != null)
            {
                MostrarModelo(new ExcepcionModel()
                {
                    ThreadGUID = Sesion.ExcepcionActual.Metodo.Hilo.ThreadGUID,
                    Clase      = Sesion.ExcepcionActual.Metodo.Clase,
                    MethodGUID = Sesion.ExcepcionActual.Metodo.MethodGUID,
                    Metodo     = Sesion.ExcepcionActual.Metodo.Nombre,
                    Tipo       = Sesion.ExcepcionActual.Tipo,
                    Mensaje    = Sesion.ExcepcionActual.Mensaje,
                    StackTrace = Sesion.ExcepcionActual.StackTrace,
                    Data       = Sesion.ExcepcionActual.Data
                });
            }

            arbol_JSON.Nodes.Clear();
            JavaScriptSerializer js = new JavaScriptSerializer();

            try
            {
                TreeNode rootNode = new TreeNode(Sesion.MetodoActual.Retorno.Tipo);
                arbol_JSON.Nodes.Add(rootNode);

                IJsonConverter converter = JsonConverterFactory.ObtenerJsonConverter();
                try
                {
                    Sesion.MetodoActual.Retorno.Valor = converter.ToObject(Sesion.MetodoActual.Retorno.Valor.ToString(), true);
                }
                catch { }
                Dictionary <string, object> dic = js.Deserialize <Dictionary <string, object> >(converter.ToJson(Sesion.MetodoActual.Retorno));
                BuildTree(dic, rootNode);
            }
            catch
            {
            }
        }
        /// <summary>
        /// Registra el inicio de un método, guarda la hora actual y cada parametro especificando
        /// nombre, tipo y valor. Se recomienda que esta sea la primera instrucción de cada método.
        /// Si se logea el inicio, es obligatorio logear el retorno aunque el método sea Void.
        /// </summary>
        /// <example>
        ///     public void Metodo1(int a, string b, bool c)
        ///     {
        ///         log.Inicio(a, b, c);
        ///         log.Retorno();
        ///     }
        ///
        ///     public void Metodo2()
        ///     {
        ///         log.Inicio();
        ///         log.Retorno();
        ///     }
        /// </example>
        /// <remarks>
        ///     Registro de versiones:
        ///
        ///         1.0 02/03/2015 Marcos Abraham Hernández Bravo (Ada Ltda.): versión inicial.
        /// </remarks>
        /// <param name="parametros">Lista de parametros del método actual.</param>
        public void Inicio(params object[] parametros)
        {
            Writers = Log4MeBO.ObtenerWriters(InstanciaLog.Metodo);
            Log4MeManager.CurrentInstance = InstanciaLog;

            Llamada++;

            RegistroInLineTO registro = new RegistroInLineTO()
            {
                ThreadGUID  = Log4MeManager.ThreadGUID,
                MethodGUID  = InstanciaLog.MethodGUID,
                Namespace   = InstanciaLog.Metodo.DeclaringType.Namespace,
                Clase       = InstanciaLog.Metodo.DeclaringType.Name,
                Metodo      = InstanciaLog.Metodo.ToString(),
                Correlativo = Llamada,
                Tipo        = Tipo.Inicio
            };

            foreach (ALogWriter writer in Writers)
            {
                if (writer.PermiteTipo(Tipo.Inicio))
                {
                    writer.Guardar(registro);
                }
            }

            int numParametro = 0;

            if (parametros != null && parametros.Length > 0)
            {
                foreach (ParameterInfo param in InstanciaLog.Metodo.GetParameters())
                {
                    Llamada++;
                    string valor = string.Empty;

                    try
                    {
                        valor = JsonConverterFactory.ObtenerJsonConverter().ToJson(parametros[numParametro], true);
                    }
                    catch (Exception e)
                    {
                        valor = "Error al transformar a Json - " + e.Message.Replace("\n", "\t");
                    }

                    RegistroInLineTO parametro = new RegistroInLineTO()
                    {
                        ThreadGUID     = Log4MeManager.ThreadGUID,
                        MethodGUID     = InstanciaLog.MethodGUID,
                        Namespace      = InstanciaLog.Metodo.DeclaringType.Namespace,
                        Clase          = InstanciaLog.Metodo.DeclaringType.Name,
                        Metodo         = InstanciaLog.Metodo.ToString(),
                        NombreVariable = param.Name,
                        ValorVariable  = valor,
                        Correlativo    = Llamada,
                        Tipo           = Tipo.Parametro
                    };

                    foreach (ALogWriter writer in Writers)
                    {
                        if (writer.PermiteTipo(Tipo.Parametro))
                        {
                            writer.Guardar(parametro);
                        }
                    }
                    numParametro++;
                }
            }
        }