# 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();
}
```