.NET, C#, Reflection: list the fields of a field that, itself, has fields
.net, c#, recursion, reflection
Solution
Use the `FieldInfo.FieldType` to reflect over the type of the fields in your class. E.g.
fieldInfo.FieldType.GetFields();
Here is a complete sample based on your code that uses recursion in case you have `ClassZ` inside `ClassA`. It breaks if you have a cyclic object graph.
using System;
using System.Reflection;
class ClassA {
public byte b;
public short s;
public int i;
}
class ClassB {
public long l;
public ClassA x;
}
class MainClass {
public static void Main() {
ClassB myBObject = new ClassB();
WriteFields(myBObject.GetType(), 0);
}
static void WriteFields(Type type, Int32 indent) {
foreach (FieldInfo fieldInfo in type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) {
Console.WriteLine("{0}{1}\t{2}", new String('\t', indent), fieldInfo.FieldType.Name, fieldInfo.Name);
if (fieldInfo.FieldType.IsClass)
WriteFields(fieldInfo.FieldType, indent + 1);
}
}
}
Problem
In .NET & C#, suppose `ClassB` has a field that is of type `ClassA`. One can easily use method `GetFields` to list `ClassB`'s fields. However, I want to also list the fields of those `ClassB` fields that themselves have fields. For example, `ClassB`'s field `x` has fields `b`, `s`, and `i`. I'd like to (programmatically) list those fields (as suggested by my comments in the code below). ``` class ClassA { public byte b ; public short s ; public int i ; } class ClassB { public long l ; public ClassA x ; } class MainClass { public static void Main ( ) { ClassA myAObject = new ClassA () ; ClassB myBObject = new ClassB () ; // My goal is this: // ***Using myBObject only***, print its fields, and the fields // of those fields that, *themselves*, have fields. // The output should look like this: // Int64 l // ClassA x // Byte b // Int16 s // Int32 i } } ```