Obtener propiedades y valores de un objeto desconocido
Del mundo de PHP he decidido darle una oportunidad a C#. Hice 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 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.
Esto debería hacerlo:
Type myType = myObject.GetType();
IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties());
foreach (PropertyInfo prop in props)
{
object propValue = prop.GetValue(myObject, null);
// Do something with propValue
}
void Test(){
var obj = new{a="aaa", b="bbb"};
var val_a = obj.GetValObjDy("a"); //="aaa"
var val_b = obj.GetValObjDy("b"); //="bbb"
}
//create in a static class
static public object GetValObjDy(this object obj, string propertyName)
{
return obj.GetType().GetProperty(propertyName).GetValue(obj, null);
}
Solución de una línea usando Linq...
var obj = new {Property1 = 1, Property2 = 2};
var property1 = obj.GetType().GetProperties().First(o => o.Name == "Property1").GetValue(obj , null);
Sí, Reflection 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. Puedes hacer esto llamando al GetType
método enObject
. Debido a que está en la clase, todosObject
los objetos en .NET pueden invocarlo , ya que todos los tipos derivan ( bueno, técnicamente, no todo , pero eso no es importante aquí).Object
Una vez que tenga la Type
instancia, puede llamar al GetProperties
método para obtener las PropertyInfo
instancias que representan la información en tiempo de ejecución sobre las propiedades en el archivo Type
.
Tenga en cuenta que puede utilizar las sobrecargas de GetProperties
para ayudar a clasificar las propiedades que recupera.
A partir de ahí, simplemente escribiría la información en un archivo.
Su código anterior, traducido, sería:
// The instance, it can be of any type.
object o = <some object>;
// Get the type.
Type type = o.GetType();
// Get all public instance properties.
// Use the override if you want to classify
// which properties to return.
foreach (PropertyInfo info in type.GetProperties())
{
// Do something with the property info.
DoSomething(info);
}
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
o respectivamente.GetFields
También tenga en cuenta que una cosa es enumerar los miembros de un archivo, pero no debe utilizar esta información para impulsar 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 realizar las llamadas en ellas (puede usar el operador as
o is
para ayudar a determinar con qué clase/interfaz base está trabajando en tiempo de ejecución).
Sin embargo, si no controla estas definiciones de tipos y tiene que controlar la lógica basada en la coincidencia de patrones, entonces está bien.