Obtener propiedades y valores de un objeto desconocido

Resuelto m4rc asked hace 14 años • 13 respuestas

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.

m4rc avatar Nov 10 '10 20:11 m4rc
Aceptado

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
}
Cocowalla avatar Nov 10 '2010 13:11 Cocowalla
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);
}
Vo Van Khoa avatar May 11 '2016 02:05 Vo Van Khoa

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);
Chris Wu avatar Sep 09 '2019 01:09 Chris Wu

Sí, Reflection sería el camino a seguir. Primero, obtendría el Typeque representa el tipo (en tiempo de ejecución) de la instancia en la lista. Puedes hacer esto llamando al GetTypemé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 Typeinstancia, puede llamar al GetPropertiesmétodo para obtener las PropertyInfoinstancias 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 GetPropertiespara 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 GetMethodso 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 aso ispara 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.

casperOne avatar Nov 10 '2010 13:11 casperOne