réponse de Jon est idéal - juste une observation: dans le cadre de la conception générale, je voudrais:
- généralement éviter réflexion contre membres non publiques
- éviter d'avoir des champs publics (presque toujours)
Le résultat de ces deux est que généralement vous avez seulement besoin de réfléchir sur les propriétés publiques (vous ne devriez pas être des méthodes d'appel à moins que vous sachiez ce qu'ils font; getters de propriété sont attendu pour être idempotent [chargement paresseux de côté]). Donc, pour PropertyInfo
c'est juste prop.GetValue(obj, null);
.
En fait, je suis un grand fan de System.ComponentModel
, donc je serais tenté d'utiliser:
foreach(PropertyDescriptor prop in TypeDescriptor.GetProperties(obj))
{
Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj));
}
ou pour une propriété spécifique:
PropertyDescriptor prop = TypeDescriptor.GetProperties(obj)["SomeProperty"];
Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj));
Un avantage de System.ComponentModel
est que fonctionnera avec des modèles de données abstraits, tels que comment un DataView
expose des colonnes en tant que propriétés virtuelles; il y a aussi d'autres astuces (comme performance tricks).
grâce jon - pourrait vous donner un exemple en commençant par un objet MemberInfo bien? –
De quel genre? MemberInfos peut être des propriétés, des champs, des méthodes, des événements ou d'autres types. Vous ne pouvez pas les traiter tous de la même manière. Quelle serait la "valeur" d'un type imbriqué, par exemple? Peut-être devriez-vous nous en dire plus sur votre problème. –
trop mauvais GetValue/SetValue n'étaient pas une interface qui pourrait être vérifiée contre. –