コード例 #1
0
        public override void OnExit(MethodExecutionArgs args)
        {
            MethodInfo methodInfo = args.Method as MethodInfo;

            if (Tipo == null)
            {
                Tipo = methodInfo.ReturnType;
            }

            IObjeto objeto = ObjetoFactory.ObtenerObjeto();

            if (objeto.esColeccion(Tipo))
            {
                Tipo        = Type.GetType(objeto.TipoSingular(Tipo));
                EsColeccion = true;
            }

            object instancia = null;

            if (Ensamblado != null)
            {
                if (EsColeccion)
                {
                    instancia = DynamicLoaderManager.ObtenerInstancias(Tipo, Ensamblado);
                }
                else
                {
                    instancia = DynamicLoaderManager.ObtenerInstancia(Tipo, Ensamblado);
                }
            }

            if (instancia == null)
            {
                if (Dominio != null)
                {
                    if (EsColeccion)
                    {
                        instancia = DynamicLoaderManager.ObtenerInstancias(Tipo, Dominio);
                    }
                    else
                    {
                        instancia = DynamicLoaderManager.ObtenerInstancia(Tipo, Dominio);
                    }
                }
            }

            if (instancia == null)
            {
                if (EsColeccion)
                {
                    instancia = DynamicLoaderManager.ObtenerInstancias(Tipo);
                }
                else
                {
                    instancia = DynamicLoaderManager.ObtenerInstancia(Tipo);
                }
            }

            if (instancia != null)
            {
                args.ReturnValue = Convert.ChangeType(instancia, methodInfo.ReturnType);
            }
            else
            {
                args.ReturnValue = Activator.CreateInstance(methodInfo.ReturnType);
            }
        }
コード例 #2
0
        /// <summary>
        /// Mapea la respuesta de la ejecución de un comando a el tipo C# especificado.
        /// Puede ser un objeto definido por el usuario, por ejemplo, un TO.
        /// </summary>
        /// <remarks>
        ///     Registro de versiones:
        ///
        ///         1.0 02/03/2015 Marcos Abraham Hernández Bravo (Ada Ltda.): versión inicial.
        /// </remarks>
        /// <typeparam name="T">Tipo de la respuesta (entidad).</typeparam>
        /// <param name="record">Respuesta obtenida de la ejecución de un comando en una base de datos.</param>
        /// <param name="campoPropiedad">Diccionario que asocia el campo de la respuesta con una propiedad de un objeto.</param>
        /// <returns>Una instancia cargada del tipo especificado y datos obtenidos de IDataReader (parámetro).</returns>
        /// <exception cref="System.InvalidOperationException">Excepción lanzada al ocurrir un erro al mapear la respuesta.</exception>
        public virtual RespuestaEjecucion <T> Mapear <T>(IDataRecord record, IDictionary <string, string> campoPropiedad)
        {
            if (record == null)
            {
                throw new NullReferenceException("¡Record no puede ser nulo!");
            }
            if (campoPropiedad == null)
            {
                throw new NullReferenceException("¡CampoPropiedad no puede ser nulo!");
            }

            try
            {
                RespuestaEjecucion <T> retorno = new RespuestaEjecucion <T>();

                //Si es un objeto definido por el usuario.
                if (!ObjetoFactory.ObtenerObjeto().esPrimitivo(typeof(T)))
                {
                    bool esInmutable = false;

                    //Obtener los atributos personalizados (Annotations) del tipo.
                    var attributos = typeof(T).GetCustomAttributes(false);

                    foreach (var atributo in attributos)
                    {
                        if (atributo is Inmutable)
                        {
                            esInmutable = (atributo as Inmutable).EsInmutable;
                        }
                    }

                    if (!esInmutable)
                    {
                        retorno.Respuesta = Activator.CreateInstance <T>();

                        IList <PropertyInfo> parametros = typeof(T).GetProperties();

                        for (int x = 0; x < record.FieldCount; x++)
                        {
                            string campo = record.GetName(x);

                            bool existeCampo = false;

                            PropertyInfo[] propiedades = retorno.Respuesta.GetType().GetProperties();

                            foreach (PropertyInfo propiedad in propiedades)
                            {
                                //Comprueba existencia de Property con mismo nombre que el campo y el mismo tipo.
                                if (propiedad.Name == campo)
                                {
                                    if (record.GetValue(x).GetType() == propiedad.PropertyType)
                                    {
                                        object valor = record[x];
                                        if (valor.GetType() == typeof(DBNull))
                                        {
                                            valor = null;
                                        }
                                        if (valor is string && RecortarTexto)
                                        {
                                            valor = valor.ToString().Trim();
                                        }
                                        propiedad.SetValue(retorno.Respuesta, valor, null);
                                        existeCampo = true;
                                        break;
                                    }
                                    else if (ObjetoFactory.ObtenerObjeto().esEnumeracion(propiedad.PropertyType))
                                    {
                                        try
                                        {
                                            object valorEnum = Enum.Parse(propiedad.PropertyType, record.GetString(x));
                                            propiedad.SetValue(retorno.Respuesta, valorEnum, null);
                                        }
                                        catch { }
                                    }
                                }
                            }

                            //Si no existe una coincidencia directa (nombre) entre Campo y Propiedad.
                            if (!existeCampo)
                            {
                                //Obtiene desde el diccionario la propiedad correspondiente al campo y carga el valor.
                                object valor = record[x];
                                if (valor is string && RecortarTexto)
                                {
                                    valor = valor.ToString().Trim();
                                }

                                //Comprueba existencia de Mapeador entre Campo y Propiedad.
                                if (campoPropiedad != null)
                                {
                                    bool existePropiedad = false;

                                    foreach (string xpropCampoPropiedad in campoPropiedad.Keys)
                                    {
                                        if (valor.GetType() == typeof(DBNull))
                                        {
                                            valor = null;
                                        }

                                        if (xpropCampoPropiedad.Contains(campo))
                                        {
                                            existePropiedad = true;
                                            ObjetoFactory.ObtenerObjeto().SetValorPropiedad(retorno.Respuesta, xpropCampoPropiedad, valor);
                                        }
                                    }

                                    if (!existePropiedad)
                                    {
                                        //Agrega el campo a las propiedades omitidas.
                                        retorno.PropiedadesOmitidas.Add(campo, valor);
                                    }
                                }
                                else
                                {
                                    //Agrega el campo a las propiedades omitidas.
                                    retorno.PropiedadesOmitidas.Add(campo, valor);
                                }
                            }
                        }

                        return(retorno);
                    }
                    else
                    {
                        for (int x = 0; x < record.FieldCount; x++)
                        {
                            string campo = record.GetName(x);
                            object valor = record.GetValue(x);
                            if (valor is string && RecortarTexto)
                            {
                                valor = valor.ToString().Trim();
                            }
                            retorno.PropiedadesOmitidas.Add(campo, valor);
                        }

                        return(retorno);
                    }
                }
                else
                {
                    object valor = record.GetValue(0);
                    if (valor is string && RecortarTexto)
                    {
                        valor = valor.ToString().Trim();
                    }
                    return(new RespuestaEjecucion <T>()
                    {
                        Respuesta = (T)Convert.ChangeType(valor, typeof(T), CultureInfo.InvariantCulture)
                    });
                }
            }
            catch (Exception e)
            {
                throw new InvalidOperationException("¡No se ha podido convertir la respuesta al tipo especificado!", e);
            }
        }