# Getting all Inherited Fields Using Reflection A simple call to `GetFields` does not return fields from base classes. For that you need to make recursive calls and combine the results. Here's an implementation in C#. It uses the [[Trampoline]] to avoid a growing stack height. ```csharp private static ImmutableDictionary<Type, IReadOnlyList<FieldInfo>> Fields = ImmutableDictionary<Type, IReadOnlyList<FieldInfo>>.Empty; private static IReadOnlyList<FieldInfo> GetFields(Type type) { Trampoline<IReadOnlyList<FieldInfo>> Inner( Type type, Func<IReadOnlyList<FieldInfo>, Trampoline<IReadOnlyList<FieldInfo>>> continuation) { if (Fields.TryGetValue(type, out var cached)) { return Trampoline.Continue(() => continuation(cached)); } var ownFields = type.GetFields( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly); var baseType = type.BaseType; if (baseType == null) { return Trampoline.Continue(() => continuation(ImmutableInterlocked.GetOrAdd(ref Fields, type, ownFields))); } return Trampoline.Continue(() => Inner( baseType, fieldsFromBaseType => { var combined = fieldsFromBaseType.Concat(ownFields).ToArray(); return continuation(ImmutableInterlocked.GetOrAdd(ref Fields, type, combined)); })); } return Inner(type, Trampoline.Done).Run(); } ```