with what method done create c# reflection

what - system.reflection c#



Obtener propiedades y valores de objetos desconocidos (10)

Desde el mundo de PHP, he decidido dar C # a ir. He tenido una búsqueda pero 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 c # pero es todo nuevo para mí.

Cualquier ayuda sería muy apreciada.


Aquí hay algo que uso para transformar un IEnumerable<T> en una DataTable que contiene columnas que representan T propiedades de T , con una fila para cada elemento en IEnumerable :

public static DataTable ToDataTable<T>(IEnumerable<T> items) { var table = CreateDataTableForPropertiesOfType<T>(); PropertyInfo[] piT = typeof(T).GetProperties(); foreach (var item in items) { var dr = table.NewRow(); for (int property = 0; property < table.Columns.Count; property++) { if (piT[property].CanRead) { var value = piT[property].GetValue(item, null); if (piT[property].PropertyType.IsGenericType) { if (value == null) { dr[property] = DBNull.Value; } else { dr[property] = piT[property].GetValue(item, null); } } else { dr[property] = piT[property].GetValue(item, null); } } } table.Rows.Add(dr); } return table; } public static DataTable CreateDataTableForPropertiesOfType<T>() { DataTable dt = new DataTable(); PropertyInfo[] piT = typeof(T).GetProperties(); foreach (PropertyInfo pi in piT) { Type propertyType = null; if (pi.PropertyType.IsGenericType) { propertyType = pi.PropertyType.GetGenericArguments()[0]; } else { propertyType = pi.PropertyType; } DataColumn dc = new DataColumn(pi.Name, propertyType); if (pi.CanRead) { dt.Columns.Add(dc); } } return dt; }

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:

public class Car { string Make { get; set; } int YearOfManufacture {get; set; } }

Y se le devolverá una DataTable con la estructura:

Hacer (cadena)
YearOfManufacture (int)

Con una fila por artículo en su List<Car>


Este ejemplo recorta todas las propiedades de cadena de un objeto.

public static void TrimModelProperties(Type type, object obj) { var propertyInfoArray = type.GetProperties( BindingFlags.Public | BindingFlags.Instance); foreach (var propertyInfo in propertyInfoArray) { var propValue = propertyInfo.GetValue(obj, null); if (propValue == null) continue; if (propValue.GetType().Name == "String") propertyInfo.SetValue( obj, ((string)propValue).Trim(), null); } }


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 }


No he encontrado que esto funcione, digamos objetos de aplicación. Sin embargo, he tenido éxito con

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); string rval = serializer.Serialize(myAppObj);


Para obtener un valor de propiedad específico del nombre de la propiedad

public class Bike{ public string Name {get;set;} } Bike b = new Bike {Name = "MyBike"};

para acceder al valor de la propiedad de Nombre del nombre de la cadena de la propiedad

public object GetPropertyValue(string propertyName) { //returns value of property Name return this.GetType().GetProperty(propertyName).GetValue(this, null); }


Puede usar GetType - GetProperties - Linq Foreach :

obj.GetType().GetProperties().ToList().ForEach(p =>{ //p is each PropertyInfo DoSomething(p); });


Puedes intentar esto:

string[] arr = ((IEnumerable)obj).Cast<object>() .Select(x => x.ToString()) .ToArray();

Una vez que cada matriz implemente la interfaz IEnumerable


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 al método GetType en Object . Debido a que está en la clase Object , es invocable por cada objeto en .NET, ya que todos los tipos se derivan de Object ( bueno, técnicamente, no todo , pero eso no es importante aquí).

Una vez que tenga la instancia de Type , puede llamar al método GetProperties para obtener las instancias de PropertyInfo que representan la información en tiempo de ejecucióna sobre las propiedades en el Type .

Tenga en cuenta que puede usar las sobrecargas de GetProperties para ayudarlo 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:

// 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 del método o información de campo, deberá llamar a una de las sobrecargas de los métodos GetMethods o GetFields , respectivamente.

También tenga en cuenta que una cosa es enumerar a los miembros en un archivo, pero no debe usar esta información para conducir la lógica en función de conjuntos de propiedades.

Asumiendo 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 esas (puede usar el operador as o is para ayudar a determinar qué clase base / interfaz está trabajando con en tiempo de ejecución).

Sin embargo, si no controla estas definiciones de tipo y tiene que conducir la lógica en función de la coincidencia de patrones, entonces está bien.


bien, en C # es similar. Este es uno de los ejemplos más simples (solo para propiedades públicas):

var someObject = new { .../*properties*/... }; var propertyInfos = someObject.GetType().GetProperties(); foreach (PropertyInfo pInfo in PropertyInfos) { string propertyName = pInfo.Name; //gets the name of the property doSomething(pInfo.GetValue(SomeObject,null)); }


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); }