2009-10-06 8 views
2

Essayant de comprendre comment créer une méthode qui parcourra les propriétés d'un objet et les génère (disons console.writeline pour le moment).Une méthode qui itère sur les propriétés des objets passés

Est-ce possible en utilisant la réflexion?

par exemple.

public void OutputProperties(object o) 
{ 

     // loop through all properties and output the values 

} 

Répondre

4

Effectuez les opérations suivantes

public void OutputProperties(object o) { 
    if (o == null) { throw new ArgumentNullException(); } 
    foreach (var prop in o.GetType().GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) { 
    var value = prop.GetValue(o,null); 
    Console.WriteLine("{0}={1}", prop.Name, value); 
    } 
} 

Ceci affichera toutes les propriétés déclarées sur le type spécifique. Il échouera si l'une des propriétés renvoie une exception lorsqu'elle est évaluée.

1

Oui, vous pouvez utiliser

foreach (var objProperty in o.GetType().GetProperties()) 
{ 
    Console.WriteLine(objProperty.Name + ": " + objProperty.GetValue(o, null)); 
} 
2

Une alternative à l'aide TypeDescriptor, ce qui permet des modèles d'objets personnalisés pour afficher les propriétés flexibles lors de l'exécution (à savoir ce que vous voyez peut être plus que ce qui est de la classe, et peut utiliser de type convertisseurs pour effectuer la conversion de chaîne) personnalisés:

public static void OutputProperties(object obj) 
{ 
    if (obj == null) throw new ArgumentNullException("obj"); 
    foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(obj)) 
    { 
     object val = prop.GetValue(obj); 
     string s = prop.Converter.ConvertToString(val); 
     Console.WriteLine(prop.Name + ": " + s); 
    } 
} 

Notez que la réflexion est la valeur par défaut mise en œuvre - mais beaucoup d'autres modèles plus intéressants sont possibles, via ICustomTypeDescriptor et TypeDescriptionProvider.

+0

n'utilisent-ils pas en interne la réflexion? – mrblah

Questions connexes