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