software realizar que objeto modelo ingenieria informatica fundamentos dominio componentes como clave analisis abstracciones c# linq entity-framework telerik-open-access

c# - realizar - Iterar a través de propiedades y valores de un objeto devuelto a través de una consulta linq en un modelo de dominio



que es modelo de dominio en informatica (3)

Tengo una entidad personalizada en una base de datos relacional que he asignado al CLR a través de un modelo de dominio. Entonces, al usar la siguiente declaración, puedo incorporar una entidad desde mi base de datos a la memoria a través de una consulta LINQ en el modelo de dominio, como tal;

var inspection = (from i in dbContext.New_testinspectionExtensionBases where i.New_testinspectionId == currentInspection select i).First();

Hay propiedades / campos en esta entidad a los que necesito acceder, necesito poder determinar el nombre de propiedad / campo así como su valor. Quiero recorrer estos elementos en la memoria y escribir sus nombres y valores en la consola.

Traté de usar este enfoque, pero no pude encontrar la forma de corregir la sintaxis (Tampoco estoy seguro de que GetProperties sea el método correcto para usar, GetFields no devolvía nada por algún motivo, así que supuse que este era el camino a seguir) pero en realidad no importa ya que todo lo que necesito es acceso de lectura al valor;

var inspectionReportFields = inspection.GetType().GetProperties(); // I called this inspectionReportfields because the entity properties correspond to // form/report fields I''m generating from this data. foreach (var reportField in inspectionReportFields) { var value = reportField.GetValue(); Console.WriteLine(reportField.Name); Console.WriteLine(value); }

¿Hay alguna manera más fácil de obtener el valor de propiedad / campo cuando se utiliza un modelo de dominio como EF o openaccess? Si no, ¿lo estoy haciendo de la manera correcta? Y, por último, si es así, ¿cómo arreglo la sintaxis en la declaración de la variable de valor?

Aquí hay algunos campos / propiedades de muestra del código generado por el modelo de dominio, para referencia;

private int? _new_systemGauges; public virtual int? New_systemGauges { get { return this._new_systemGauges; } set { this._new_systemGauges = value; } } private int? _new_systemAlarm ; public virtual int? New_systemAlarm { get { return this._new_systemAlarm; } set { this._new_systemAlarm = value; } }


Si está utilizando OpenAccess, siempre tendrá a su disposición la información completa sobre sus clases modelo. La información allí se recupera de su asignación, lo que significa que no necesita reflexionar sobre sus clases (sin gastos generales).

Solo navegue a través de context.Metadata.PersistentTypes para obtener toda la información de asignación de clases.


Supongo que está tratando de definir una forma de propósito general para "volcar" un objeto sin saber nada sobre su estructura. Si es así, entonces estás haciendo las cosas de la manera correcta. Utiliza el reflejo ( GetType() y los métodos de clase de Type asociados) para inspeccionar el objeto y devolver su información.

El motivo por el cual GetFields() no devolvió nada es que probablemente no proporcionó los indicadores de enlace correctos. En particular, si llama a la sobrecarga que no toma ningún parámetro, solo recupera public campos public ; si desea campos privados, debe solicitarlos específicamente.

En su caso, GetFields(BindingFlags.NonPublic) le devolverá los campos _new_systemGauges y _new_systemAlarm , mientras que GetProperties () le devolverá las propiedades New_systemAlarm y New_systemAlarm .

El otro elemento clave que omitió es que los datos que está recibiendo son los metadatos del tipo ; define la estructura de la class , y no cualquier instancia particular. Si desea saber cuál es el valor de una propiedad para una instancia específica, debe solicitarla:

foreach (var prop in obj.GetType().GetProperties()) { Console.WriteLine("{0} = {1}", prop.Name, prop.GetValue(obj, null)); }

Si tiene uno de los elementos de PropertyInfo de los metadatos del tipo, puede solicitar el valor de esa propiedad en cualquier instancia de ese tipo. No tiene que ser la misma instancia que usaste originalmente. Por ejemplo:

var objs = somelist.Where(x => x.Id == 1); foreach (var prop in objs.First().GetType().GetProperties()) { int x = 0; foreach (var obj in objs) { if (prop.PropertyType.Name.Equals("Int32")) { int val = (int)prop.GetValue(obj, null); Console.WriteLine("Obj #{0}: {1} = 0x{2:x8}", x++, prop.Name, val); } else if (prop.PropertyType.Name.Equals("Decimal")) { int val = (decimal)prop.GetValue(obj, null); Console.WriteLine("Obj #{0}: {1} = {2:c2}", x++, prop.Name, val); } else { Console.WriteLine("Obj #{0}: {1} = ''{2}''", x++, prop.Name, prop.GetValue(obj, null)); } } }

Técnicamente, debería verificar el resultado de GetIndexParameters para ver si una propiedad está indexada o no; el parámetro null para GetValue es en realidad una matriz de valores de índice.

Para convertir el valor que recibe, puede usar typecasts o, si quiere ser un poco más flexible, use los métodos de la clase Convert. La diferencia es, por ejemplo, si tiene una propiedad short , GetValue() devolverá un short enmarcado, que luego no podrá encasillar como int ; tienes que destrabarlo en primer lugar. El uso de Convert.ToInt32() realizará todos los pasos necesarios para obtener un valor int de cualquier propiedad convertible en un entero.

La conversión entre tipos de referencia es más fácil ya que solo puede usar is y en as a eso; esos funcionan exactamente como esperarías con valores de propiedad "reflejados".


GetProperties hecho es el método correcto.

Para deshacerse del error del compilador, cambie su código a este:

var value = reportField.GetValue(inspection, null);

Debe pasar la instancia desde la que desea obtener el valor, ya que un objeto PropertyInfo no está vinculado a ninguna instancia de clase específica.

Considere seguir las reglas de nombres .NET estándar.

Esto llevaría a lo siguiente:

NewSystemAlarm lugar de New_systemAlarm
newSystemAlarm o _newSystemAlarm lugar de _new_systemAlarm
NewTestInspectionExtensionBases lugar de New_testinspectionExtensionBases
NewTestInspectionId lugar de New_testinspectionId