.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 } } ```

Original source