J'ai un cours:
class A {
public string a = "A-val" , b = "B-val";
}
Je veux imprimer l'objet membres par réflexion
//Object here is necessary.
Object data = new A();
FieldInfo[] fields = data.GetType().GetFields();
String str = "";
foreach(FieldInfo f in fields){
str += f.Name + " = " + f.GetValue(data) + "\r\n";
}
Voici le résultat souhaité:
a = A-val
b = B-val
Malheureusement, cela n'a pas fonctionné. S'il vous plaît aider, merci.
Une fois résolu de se débarrasser des erreurs (sans point-virgule et nom de variable incorrect), le code que vous avez posté fonctionne fonctionne - je viens de l'essayer et il affiche les noms et les valeurs sans problème .
Je suppose qu'en réalité, vous essayez d'utiliser des champs qui ne sont pas publics. Ce code:
FieldInfo[] fields = data.GetType().GetFields();
... obtiendra seulement public fields. Vous devez normalement spécifier que vous souhaitez également des champs non publics:
FieldInfo[] fields = data.GetType().GetFields(BindingFlags.Public |
BindingFlags.NonPublic |
BindingFlags.Instance);
(J'espère que vous n'avez pas vraiment des champs publics, après tout ...)
Rappelez-vous lorsque vous écrivez des champs tels que:
public string VarName{ get; set;}
Alors en fait, vous avez ce code (voici ce que vous voyez voir:
private string _varName;
public string get_VarName(){
....
}
public void set_VarName(strig value){
....
}
Comme @Stanislav le dit, vous devez garder à l'esprit les champs de sauvegarde générés par le compilateur pour les propriétés. Si vous souhaitez exclure ces champs, vous pouvez utiliser le code suivant:
FieldInfo[] fields = data.GetType()
.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
.Where(f => f.GetCustomAttribute<CompilerGeneratedAttribute>() == null)
.ToArray();