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