vez valores una recorrer propiedades obtener objetos objeto net listas lista las clase .net vb.net class reflection properties

.net - valores - recorrer las propiedades de una clase



¿Cómo recorrer todas las propiedades de una clase? (7)

Aquí hay otra forma de hacerlo, usando un LINQ lambda:

DO#:

SomeObject.GetType().GetProperties().ToList().ForEach(x => Console.WriteLine($"{x.Name} = {x.GetValue(SomeObject, null)}"));

VB.NET:

SomeObject.GetType.GetProperties.ToList.ForEach(Sub(x) Console.WriteLine($"{x.Name} = {x.GetValue(SomeObject, Nothing)}"))

Tengo una clase.

Public Class Foo Private _Name As String Public Property Name() As String Get Return _Name End Get Set(ByVal value As String) _Name = value End Set End Property Private _Age As String Public Property Age() As String Get Return _Age End Get Set(ByVal value As String) _Age = value End Set End Property Private _ContactNumber As String Public Property ContactNumber() As String Get Return _ContactNumber End Get Set(ByVal value As String) _ContactNumber = value End Set End Property End Class

Quiero recorrer las propiedades de la clase anterior. p.ej;

Public Sub DisplayAll(ByVal Someobject As Foo) For Each _Property As something In Someobject.Properties Console.WriteLine(_Property.Name & "=" & _Property.value) Next End Sub


Así es como lo hago.

foreach (var fi in typeof(CustomRoles).GetFields()) { var propertyName = fi.Name; }


La reflexión es bastante "pesada"

Quizás pruebe esta solución: // C #

if (item is IEnumerable) { foreach (object o in item as IEnumerable) { //do function } } else { foreach (System.Reflection.PropertyInfo p in obj.GetType().GetProperties()) { if (p.CanRead) { Console.WriteLine("{0}: {1}", p.Name, p.GetValue(obj, null)); //possible function } } }

''VB.Net

If TypeOf item Is IEnumerable Then For Each o As Object In TryCast(item, IEnumerable) ''Do Function Next Else For Each p As System.Reflection.PropertyInfo In obj.GetType().GetProperties() If p.CanRead Then Console.WriteLine("{0}: {1}", p.Name, p.GetValue(obj, Nothing)) ''possible function End If Next End If

La reflexión disminuye +/- 1000 veces la velocidad de una llamada a un método, que se muestra en El rendimiento de las cosas cotidianas


Tenga en cuenta que si el objeto del que está hablando tiene un modelo de propiedad personalizado (como DataRowView etc. para DataTable ), entonces necesita usar TypeDescriptor ; la buena noticia es que esto todavía funciona bien para las clases regulares (y puede incluso ser mucho más rápido que la reflexión ):

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

Esto también proporciona un fácil acceso a cosas como TypeConverter para formatear:

string fmt = prop.Converter.ConvertToString(prop.GetValue(obj));


Use Reflection:

Type type = obj.GetType(); PropertyInfo[] properties = type.GetProperties(); foreach (PropertyInfo property in properties) { Console.WriteLine("Name: " + property.Name + ", Value: " + property.GetValue(obj, null)); }

Editar: También puede especificar un valor type.GetProperties() para type.GetProperties() :

BindingFlags flags = BindingFlags.Public | BindingFlags.Instance; PropertyInfo[] properties = type.GetProperties(flags);

Eso restringirá las propiedades devueltas a las propiedades de instancias públicas (excluyendo propiedades estáticas, propiedades protegidas, etc.).

No necesita especificar BindingFlags.GetProperty , lo usa cuando llama a type.InvokeMember() para obtener el valor de una propiedad.


Versión VB de C # dada por Brannon:

Public Sub DisplayAll(ByVal Someobject As Foo) Dim _type As Type = Someobject.GetType() Dim properties() As PropertyInfo = _type.GetProperties() ''line 3 For Each _property As PropertyInfo In properties Console.WriteLine("Name: " + _property.Name + ", Value: " + _property.GetValue(Someobject, Nothing)) Next End Sub

Usar banderas de encuadernación en lugar de la línea nº 3

Dim flags As BindingFlags = BindingFlags.Public Or BindingFlags.Instance Dim properties() As PropertyInfo = _type.GetProperties(flags)


private void ResetAllProperties() { Type type = this.GetType(); PropertyInfo[] properties = (from c in type.GetProperties() where c.Name.StartsWith("Doc") select c).ToArray(); foreach (PropertyInfo item in properties) { if (item.PropertyType.FullName == "System.String") item.SetValue(this, "", null); } }

Utilicé el bloque de código anterior para restablecer todas las propiedades de cadena en mi objeto de control de usuario web cuyos nombres se inician con "Doc".