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