41 votes

C# Reflection - Obtenir les valeurs des champs d'une classe simple

J'ai un cours :

class A {
    public string a = "A-val" , b = "B-val";
}

Je veux imprimer les membres de l'objet 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é. Veuillez m'aider, merci.

72voto

Jon Skeet Points 692016

Une fois corrigé pour éliminer les erreurs (absence de point-virgule et mauvais nom de variable), le code que vous avez posté fait Je viens de l'essayer et il a montré les noms et les valeurs sans problème.

Je pense qu'en réalité, vous essayez d'utiliser des champs qui ne sont pas publics. Ce code :

FieldInfo[] fields = data.GetType().GetFields();

... n'obtiendra que public champs. Vous devez normalement préciser 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 realmente ont des champs publics, après tout...)

3voto

N'oubliez pas que lorsque vous écrivez des champs comme :

public string VarName{ get; set;}

Alors en fait vous avez ce code (c'est ce que la réflexion voit) :

private string _varName;
public string get_VarName(){
....
}
public void set_VarName(strig value){
....
}

1voto

Joseph Points 4812

Comme le dit @Stanislav, vous devez garder à l'esprit les champs de sauvegarde générés par le compilateur pour les propriétés. Si vous voulez 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();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X