web-dev-qa-db-fra.com

C # Reflection - Obtenir les valeurs de champ d'une classe simple

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.

30
SexyMF

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 ...)

57
Jon Skeet

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){
....
}
3

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();
1
Joseph