Desde el mundo de PHP, he decidido probar C #. He tenido una búsqueda pero parece que no puedo encontrar la respuesta de cómo hacer el equivalente a esto.
$object = new Object();
$vars = get_class_vars(get_class($object));
foreach($vars as $var)
{
doSomething($object->$var);
}
Básicamente tengo una lista de un objeto. El objeto podría ser uno de los tres tipos diferentes y tendrá un conjunto de propiedades públicas. Quiero poder obtener una lista de las propiedades del objeto, recorrerlas y luego escribirlas en un archivo. Estoy pensando que esto tiene algo que ver con la reflexión de C #, pero todo es nuevo para mí.
Cualquier ayuda sería muy apreciada.
c#
reflection
m4rc
fuente
fuente
Respuestas:
Esto debería hacerlo:
fuente
System.Reflection
namespacePropertyInfo[] props = input.GetType().GetProperties();
Newtonsoft.Json.JsonConvert
?fuente
Sí, la reflexión sería el camino a seguir. Primero, obtendría el
Type
que representa el tipo (en tiempo de ejecución) de la instancia en la lista. Puede hacer esto llamando alGetType
métodoObject
. Debido a que está en laObject
clase, todos los objetos en .NET pueden llamarlo, ya que todos los tipos se derivan deObject
( bueno, técnicamente, no todo , pero eso no es importante aquí).Una vez que tenga la
Type
instancia, puede llamar alGetProperties
método para obtener lasPropertyInfo
instancias que representan la información de tiempo de ejecución sobre las propiedades en elType
.Tenga en cuenta que puede usar las sobrecargas de
GetProperties
para ayudar a clasificar qué propiedades recupera.A partir de ahí, simplemente escribiría la información en un archivo.
Su código anterior, traducido, sería:
Tenga en cuenta que si desea información de método o información de campo, deberá llamar a una de las sobrecargas de los métodos
GetMethods
oGetFields
respectivamente.También tenga en cuenta que una cosa es enumerar los miembros de un archivo, pero no debe usar esta información para conducir la lógica basada en conjuntos de propiedades.
Suponiendo que tiene control sobre las implementaciones de los tipos, debe derivar de una clase base común o implementar una interfaz común y hacer las llamadas en esos (puede usar el operador
as
uis
para ayudar a determinar con qué clase / interfaz base está trabajando en tiempo de ejecución).Sin embargo, si no controla estas definiciones de tipo y tiene que manejar la lógica basada en la coincidencia de patrones, entonces está bien.
fuente
bueno, en C # es similar. Este es uno de los ejemplos más simples (solo para propiedades públicas):
fuente
Para obtener un valor de propiedad específico del nombre de la propiedad
para acceder al valor de propiedad de Nombre desde el nombre de cadena de la propiedad
fuente
Puede usar GetType - GetProperties - Linq Foreach :
fuente
Solución de una línea usando Linq ...
fuente
Aquí hay algo que uso para transformar un
IEnumerable<T>
archivoDataTable
que contiene columnas que representanT
las propiedades de, con una fila para cada elemento enIEnumerable
:Esto es "algo" demasiado complicado, pero en realidad es bastante bueno para ver cuál es el resultado, ya que puede darle una
List<T>
de, por ejemplo:Y se le devolverá una DataTable con la estructura:
Con una fila por artículo en su
List<Car>
fuente
Este ejemplo recorta todas las propiedades de cadena de un objeto.
fuente
No he encontrado esto para trabajar, digamos objetos de aplicación. Sin embargo, he tenido éxito con
fuente
fuente
fuente
Puedes probar esto:
Una vez que cada matriz implementa la interfaz IEnumerable
fuente