Если вам нужны экземпляры (образцы) всех типов, реализующих определенный интерфейс, вы можете пройти через все типы, проверить интерфейс и создать экземпляр, если совпадение найдено.
Вот некоторый псевдокод, который замечательно похож на C # и может даже скомпилировать и вернуть то, что вам нужно. Если ничего другого, он укажет вам правильное направление:
public static IEnumerable<T> GetInstancesOfImplementingTypes<T>()
{
AppDomain app = AppDomain.CurrentDomain;
Assembly[] ass = app.GetAssemblies();
Type[] types;
Type targetType = typeof(T);
foreach (Assembly a in ass)
{
types = a.GetTypes();
foreach (Type t in types)
{
if (t.IsInterface) continue;
if (t.IsAbstract) continue;
foreach (Type iface in t.GetInterfaces())
{
if (!iface.Equals(targetType)) continue;
yield return (T) Activator.CreateInstance(t);
break;
}
}
}
}
Теперь, если вы говорите об обходе кучи и возврате ранее созданных экземпляров всех объектов, которые реализуют определенный тип, удачи вам, так как эта информация не сохраняется в среде выполнения .Net (может быть вычислена отладчиками / профилировщиками исследуя кучу / стек так).
В зависимости от причины, по которой вы считаете, что вам нужно это сделать, возможно, есть лучшие способы сделать это.