qué que programacion objetos objeto metodos herencia ejemplos dinamicos clases c# object field public

que - ¿Cómo puedo encontrar todos los campos públicos de un objeto en C#?



que es public en programacion (5)

Por supuesto, otra pregunta sería "¿por qué tienes campos públicos?" - las propiedades son preferibles. Como abstracción, tenga en cuenta que la reflexión no es la única opción: también es posible que un tipo exponga sus propiedades sobre la marcha en tiempo de ejecución (por ejemplo, cómo un DataTable / DataView expone las columnas como propiedades).

Para admitir esto (aunque también admite objetos simples), usaría TypeDescriptor :

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

Esto también permite numerosas opciones de extensibilidad, por ejemplo, agilizar enormemente la reflexión (sin cambiar ningún código).

Estoy construyendo un método para tomar una ArrayList (presumiblemente llena de objetos) y luego enumerar todos los campos (y sus valores) para cada objeto en ArrayList.

Actualmente mi código es el siguiente:

public static void ListArrayListMembers(ArrayList list) { foreach (Object obj in list) { Type type = obj.GetType(); string field = type.GetFields().ToString(); Console.WriteLine(field); } }

Por supuesto, entiendo el problema inmediato con este código: si funciona, solo imprimirá un campo por objeto en ArrayList. Lo arreglaré más tarde. Ahora mismo tengo curiosidad por saber cómo obtener todos los campos públicos asociados con un objeto.

EDIT: Perdón por las respuestas de los flip-flops. Debería haber probado todos los métodos antes de seleccionar una respuesta.


Puede obtener todos los campos de objetos declarados directamente en la clase con BindingFlags:

GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)

y todos los campos objeto incluidos heredados con:

GetFields(BindingFlags.Public | BindingFlags.Instance)


foreach (Object obj in list) { Type type = obj.GetType(); foreach (var f in type.GetFields().Where(f => f.IsPublic)) { Console.WriteLine( String.Format("Name: {0} Value: {1}", f.Name, f.GetValue(obj)); } }

Tenga en cuenta que este código requiere .NET 3.5 para funcionar ;-)


public static void ListArrayListMembers(ArrayList list) { foreach (Object obj in list) { Type type = obj.GetType(); Console.WriteLine("{0} -- ", type.Name); Console.WriteLine(" Properties: "); foreach (PropertyInfo prop in type.GetProperties()) { Console.WriteLine("/t{0} {1} = {2}", prop.PropertyType.Name, prop.Name, prop.GetValue(obj, null)); } Console.WriteLine(" Fields: "); foreach (FieldInfo field in type.GetFields()) { Console.WriteLine("/t{0} {1} = {2}", field.FieldType.Name, field.Name, field.GetValue(obj)); } } }

Me gustaría mencionar que no es necesario buscar IsPublic en los campos como type.GetFields () tal como lo definen los estados de MSDN :

Valor devuelto - Tipo: System.Reflection.FieldInfo []

Una matriz de objetos FieldInfo que representan todos los campos públicos definidos para el Tipo actual.


static void ListArrayListMembers(ArrayList list) { foreach (object obj in list) { Type type = obj.GetType(); foreach (FieldInfo field in type.GetFields(BindingFlags.Public)) { Console.WriteLine(field.Name + " = " + field.GetValue(obj).ToString()); } } }