>If we use GetTypes(), a derived class can always filter away the non-public types. On the other hand, if we use GetExportedTypes(), there's no easy way to get the non-public types back.

If I correctly understand your comment as above, it sounds like `ReflectionVisitor<T>` has a protected method as the following, but on the current, a subclass of `ReflectionVisitor<T>` should override the entire `Visit(AssemblyElement)` method to filter `TypeElement`. regardless of using `GetTypes()` or `GetExportedTypes()`.

```c#
procted IEnumerable<TypeElement> GetTypeElements(AssemblyElement assemblyElement)
{
    return assemblyElement.Assembly.GetTypes().Select(t => t.ToElement()).ToArray();
}
```