.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".