2009-11-04 6 views
7

J'ai un objet qui a un grand nombre de propriétés. J'aimerais obtenir la valeur de chacune de ces propriétés en bouclant simplement la collection de propriétés de l'objet.Obtenir la valeur de la propriété dynamiquement

J'ai regardé dans la méthode PropertyInfo.GetValue() mais cela n'a pas beaucoup de sens dans le contexte que j'ai.

Voici un exemple de ce que je suis en train de faire (ce code ne fonctionne pas BTW):

foreach(var item in dataObjects) 
    { 
    foreach(PropertyInfo prop in item.GetType().GetProperties()) 
    { 
     String value = prop.GetValue().ToString() 
    } 
    } 

Je me rends compte maintenant que de récupérer la valeur d'une propriété est pas facile. Qu'est-ce que je rate? Je ne comprends pas vraiment ce que j'ai besoin de passer à la méthode GetValue() parce que je veux simplement la valeur de la propriété sur laquelle j'appelle cette méthode.

Merci pour toute aide clarifier cela pour moi. J'ai passé quelques heures ici à me taper la tête contre le bureau.

+2

Comment cela compile-t-il même? – Tinister

+2

Ce n'est pas le cas. C'est un exemple de ce que je "veux" faire, pas de ce que fait réellement le code. :) –

Répondre

10

Vous devez fournir l'objet spécifique sur lequel vous voulez appeler la propriété en question:

prop.GetValue(item, null); 

Le PropertyInfo est juste metatdata sur la propriété du type, pas sur l'instance d'objet spécifique. Le PropertyInfo ne sait pas de quelle instance il provient (le cas échéant) - juste le type/classe d'où il vient.

Vous pouvez presque considérer le PropertyInfo comme le nom de la propriété. Ce n'est pas assez d'informations pour faire quoi que ce soit avec lui seul - nous devons alors dire "obtenir la valeur de la propriété avec ce nom sur ... quoi?" Sur l'objet que nous fournissons.

3

PropertyInfo représente la propriété proprement dite (type, méthode get, méthode set, et cetera), pas une propriété liée à une instance spécifique. Si la propriété n'est pas statique, vous devez fournir une instance pour lire cette propriété à partir de - c'est le premier paramètre de GetValue. En d'autres termes, si pi est un PropertyInfo représentant la propriété Test sur une classe et someObject est une instance de cette classe:

object a = someObject.Test; 
object b = pi.GetValue(someObject, null); 

les deux lignes d'atteindre vos objectifs la valeur de la même propriété sur le même objet. Si la propriété est statique, vous n'avez pas besoin de passer l'instance, évidemment (passez null à la place). Le deuxième paramètre est l'index des propriétés indexées - C# ne supporte pas les propriétés indexées (il supporte les indexeurs, qui ne sont pas exactement les mêmes), donc vous n'aurez probablement jamais besoin de passer autre chose que null pour ce second paramètre sauf si vous travaillez avec un certain type d'un assembly écrit dans un langage qui supporte les propriétés indexées (comme VB, je crois).

Questions connexes