• Jueves 9 de Diciembre de 2021, 14:42

Autor Tema:  Codigo Generico PropertyInfo con T object  (Leído 1311 veces)

kintell33

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Codigo Generico PropertyInfo con T object
« en: Sábado 5 de Junio de 2010, 22:01 »
0
Buenas,

Es la primera vez que ingreso al foro, saludos a todos.
Comento la situacion.
Es un codigo que estoy desarrollando, que trabaja similar a nhibernate, pero en este caso, el mapeo es automatico con las columnas de la base de datos y las propiedades de un objeto.
El codigo es totalmente generico. Ahora mismo, estoy desarrollando la parte en la que al buscar un id en particular, este codigo generico con un datatable, un objeto, recorre los dos, y setea los valores, luego devuelve el objeto. En el siguiente modulo, esta el caso de que el objeto, tenga adentro 1 objeto, entonces tiene que al encontrar este tipo de circunstancia analizar el objeto, instanciar por el nombre el objeto nuevo, consultar a si mismo la relacion, y devolverlo para setearlo en el objeto principal y devolverlo nuevamente como corresponde.

Capaz explicarlo es un tanto complicado... pero pego un poco del codigo.

public class ProductoDao : IDaoFactory<Producto, int>
    {

        private string _table = Mapeos.MappingTables.ProductoTable;

        public Producto GetById(int id)
        {
            try
            {
                DataTable dt = new DataTable();
                new SqlDataAdapter(Connection.GetSelect(_table), Connection.GetConection()).Fill(dt);

                return GenericMethods<Producto>.GetObjectInDataTableById(new Producto(), dt, "Id", id);
            }
            catch (Exception)
            {
                throw;
            }
        }
    }


En genericMethods se encuentra el metodo GetObjectInDataTableById que hace todo el laburo de manera generica, sea el objeto que sea... le pasas el datatable, la key y la columna de la key, ademas del objeto de respuesta.

Les pego parte del codigo... a ver que les parece...

public static T GetObjectInDataTableById(T objeto, DataTable table, string tableKey, int key)
        {
            try
            {
                //found object in table by id
                int idFound = 0;

                for (int i = 0; i < table.Rows.Count; i++)
                    if (key == int.Parse(table.Rows[tableKey].ToString()))
                    { idFound = i; break; }
               
                foreach (MemberInfo mi in objeto.GetType().GetMembers())
                {
                    #region GenericFinder

                    if (mi.MemberType == MemberTypes.Property)
                    {
                        bool tipoEntidad = false;
                        bool tipoListaEntidad = false;

                        PropertyInfo pi = mi as PropertyInfo;
                        if (pi != null)
                        {
                            foreach (string valor in Enum.GetNames(typeof(eEntidades)))
                            {
                                if (valor == pi.Name)
                                    tipoEntidad = true;
                            }

                            if (tipoEntidad)
                            {
                                for (int x = 0; x < table.Columns.Count; x++)
                                {
                                    if (table.Columns
  • .ColumnName.Substring(0, table.Columns
  • .ColumnName.Length - 2) == pi.Name)

                                    {
                                        ObjectHandle claseDao;
                                        ObjectHandle claseObj;
                                        Assembly assembly = Assembly.GetExecutingAssembly();
                                        claseDao = AppDomain.CurrentDomain.CreateInstance(assembly.FullName, pi.Name + "Dao");
                                        claseObj = AppDomain.CurrentDomain.CreateInstance(assembly.FullName, pi.Name);
                                       
                                        IDaoFactory<
pi.GetType(), int> dao;
                                        dao = (IDaoFactory<
pi.GetType(), int>)claseDao.Unwrap();
                                        pi.SetValue(objeto, dao.GetById(int.Parse((table.Rows[idFound]
  • ).ToString())), null);

                                    }
                                }
                            }
                            else
                            {
                                for (int i = 0; i < table.Columns.Count; i++)
                                {
                                    if (table.Columns.ColumnName == pi.Name)
                                        pi.SetValue(objeto, (table.Rows[idFound]), null);
                                }
                            }
                        }

                    }
                    #endregion
                }

                return objeto;


            }
            catch (Exception)
            {

                throw;
            }
        }


El error lo marque en rojo...
Segun dice, faltan ";"...

Es bastante generico ese error.... pero no le estoy podiendo pasar el tipo de objeto a usar a la llamada del IDaoFactory, su constructor es <T,Idt>
El problema es que la mayoria de las veces me dice que "pi" (PropertyInfo) ya instanciado, no existe... y usando el getType, pareceria estar mal escrito...
Puede ser que este ciego y no vea un error bastante obvio, me gustaria alguna ayuda...

Desde ya gracias!! saludos!

Jeysscarr

  • Miembro MUY activo
  • ***
  • Mensajes: 134
  • Nacionalidad: co
    • Ver Perfil
Re: Codigo Generico PropertyInfo con T object
« Respuesta #1 en: Domingo 6 de Junio de 2010, 02:15 »
0
intenta usando typeof(propertyinfo) en vez de pi.gettype()
Nuestro poder está creciendo mas rápido que nuestra sabiduria

kintell33

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Codigo Generico PropertyInfo con T object
« Respuesta #2 en: Domingo 6 de Junio de 2010, 04:23 »
0
El tema es q no necesito el tipo de dato propertyinfo, sino q pi es la instancia de la propiedad d un objeto q no conoce el codigo. Por lo tanto yo necesuto pasarle ese tipo d dato al constructor generico de la interfaz... si no pondria el obejto sin instanciar y funca, pero no lo se