wake-up-neo.net

C # Reflection - Abrufen von Feldwerten aus einer einfachen Klasse

Ich habe ein klasse:

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

Ich möchte die Objektmitglieder durch Reflektion drucken 

//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";
}

Hier ist das gewünschte Ergebnis:

a = A-val
b = B-val

Leider hat das nicht funktioniert. Bitte helfen, danke.

30
SexyMF

Einmal behoben, um die Fehler zu beseitigen (fehlendes Semikolon und ein falscher Variablenname), funktioniert der von Ihnen gepostete Code funktioniert. Ich habe es gerade ausprobiert und es wurden Namen und Werte ohne Probleme angezeigt .

Ich vermute, dass Sie in der Realität versuchen, Felder zu verwenden, die nicht öffentlich sind. Dieser Code:

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

... erhält nur public Felder. Normalerweise müssen Sie angeben, dass auch nicht öffentliche Felder gewünscht werden:

FieldInfo[] fields = data.GetType().GetFields(BindingFlags.Public | 
                                              BindingFlags.NonPublic | 
                                              BindingFlags.Instance);

(Ich hoffe, dass Sie nicht wirklich öffentliche Felder haben, schließlich ...)

57
Jon Skeet

Denken Sie daran, wenn Sie Felder schreiben wie: 

public string VarName{ get; set;}

Dann haben Sie tatsächlich diesen Code (das ist, was Reflexion sieht): 

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

Wie @Stanislav sagt, müssen Sie die vom Compiler generierten Unterstützungsfelder für Eigenschaften berücksichtigen. Wenn Sie diese Felder ausschließen möchten, können Sie den folgenden Code verwenden:

FieldInfo[] fields = data.GetType()
    .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
    .Where(f => f.GetCustomAttribute<CompilerGeneratedAttribute>() == null)
    .ToArray();
1
Joseph