Как все отметили, проблема в том, что тип полученного элемента не совпадает с ожидаемым типом.
Чтобы не писать каждый раз for / while / foreach, мне нравится использовать метод расширения, который обрабатывает итерацию для меня.
public static class Sequence
{
public static IEnumerable<T> Create<T>(T seed, Func<T, bool> predicate, Func<T, T> next)
{
for (T t = seed; predicate(t); t = next(t))
yield return t;
}
}
Таким образом, вы можете вернуть поля, написав гораздо более читаемый запрос
public static IEnumerable<FieldInfo> GetAllFields(Type objectType)
{
BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly;
return from type in Sequence.Create(objectType, t => t != null, t => t.BaseType)
from field in type.GetFields(flags)
select field;
}