2010-05-04 20 views
12

Tengo la siguiente estructura de clase ficticia y estoy tratando de averiguar cómo obtener las propiedades de cada instancia de la clase People en PeopleList. Sé cómo obtener las propiedades de una sola instancia de People, pero no puedo imaginar cómo obtenerlas de PeopleList. Estoy seguro de que esto es muy sencillo, pero ¿alguien puede señalarme en la dirección correcta?C# Reflection and Getting Properties

public class Example 
{ 
    public class People 
    { 
     private string _name; 
     public string Name 
     { 
      get { return _name; } 
      set { _name = value; } 
     } 

     private int _age; 
     public int Age 
     { 
      get { return _age; } 
      set { _age = value; } 
     } 

     public People() 
     { 

     } 

     public People(string name, int age) 
     { 
      this._name = name; 
      this._age = age; 
     } 
    } 

    public class PeopleList : List<People> 
    { 
     public static void DoStuff() 
     { 
      PeopleList newList = new PeopleList(); 

      // Do some stuff 

      newList.Add(new People("Tim", 35)); 
     } 
    }   
} 
+1

Mira esta publicación: http://stackoverflow.com/questions/862783/setting-properties-of-an-object-through-reflection-with-different-properties-type – jjxtra

+0

¿Qué quieres decir con que no puedes obtenerlos de 'PeopleList'? No hay propiedades en su ejemplo, aparte del estándar 'Count' y' Capacity' ... –

+0

No estoy seguro de lo que quiere decir. ¿Hay diferentes clases que pueden heredar de 'Personas' y desea obtener esas propiedades, o simplemente desea obtener los diversos valores de los elementos dentro de la lista (si es así, no entiendo por qué necesita reflexión para este) ¿Podría agregar un ejemplo de cómo pretende utilizar esta información (el pseudo código debería ser lo suficientemente bueno)? –

Respuesta

26

todavía no es 100% seguro de lo que quiere, pero esto poco rápido de código (no probado) podría conseguir que en el camino correcto (o al menos ayudar a aclarar lo que quiere).

void ReportValue(String propName, Object propValue); 

void ReadList<T>(List<T> list) 
{ 
    var props = typeof(T).GetProperties(); 
    foreach(T item in list) 
    { 
    foreach(var prop in props) 
    { 
     ReportValue(prop.Name, prop.GetValue(item)); 
    } 
    } 
} 

C# debe ser capaz de trabajar que hereda 'PeopleList' de 'Lista' y manejar eso bien, pero si es necesario tener 'PeopleList' como el tipo genérico, entonces esto debería funcionar:

void ReadList<T>(T list) where T : System.Collections.IList 
{ 
    foreach (Object item in list) 
    { 
    var props = item.GetType().GetProperties(); 
    foreach (var prop in props) 
    { 
     ReportValue(prop.Name, prop.GetValue(item, null)); 
    } 
    } 
} 

Tenga en cuenta que esto realmente procesará las propiedades en los tipos derivados dentro de la lista también.

+0

Eso es casi exactamente lo que pretendía hacer. Sin embargo, ¿cómo lo harías si (List list) fuera (T obj) donde T es PeopleList? ¿O no es el camino a seguir? ¿Es simplemente mejor usar (Lista lista)? Esto es con lo que estoy luchando. – Nathan

+0

@Nathan - solo podría usar 'IEnumerable ', ya que estoy * adivinando * que 'PeopleList' es' IEnumerable '. –