Как я получаю все экземпляры всех загруженных типов, которые реализуют данный интерфейс?

function count() {
    array_elements = ["a", "b", "c", "d", "e", "a", "b", "c", "f", "g", "h", "h", "h", "e", "a"];

    array_elements.sort();

    var current = null;
    var cnt = 0;
    for (var i = 0; i < array_elements.length; i++) {
        if (array_elements[i] != current) {
            if (cnt > 0) {
                document.write(current + ' comes --> ' + cnt + ' times
'); } current = array_elements[i]; cnt = 1; } else { cnt++; } } if (cnt > 0) { document.write(current + ' comes --> ' + cnt + ' times'); } }

Демо-скрипт

16
задан Simon 21 February 2009 в 10:05
поделиться

4 ответа

Я не полагаю, что существует путь... Необходимо было бы или быть в состоянии обойти "кучу", и исследовать каждый объект там или обойти стопку каждого активного потока в пространстве процесса приложения, исследуя каждую ссылочную переменную стека на каждом потоке...

другой путь, (я предполагаю Вас, не может сделать), прерывание все операции Создания объекта (использующий контейнерный подход), и сохраните список всех объектов в Вашем приложении...

8
ответ дан 30 November 2019 в 12:21
поделиться

Если вам нужны экземпляры (образцы) всех типов, реализующих определенный интерфейс, вы можете пройти через все типы, проверить интерфейс и создать экземпляр, если совпадение найдено.

Вот некоторый псевдокод, который замечательно похож на 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 (может быть вычислена отладчиками / профилировщиками, исследуя кучу / стек).

В зависимости от причины, по которой вы думаете, что вам нужно это сделать, возможно, есть лучшие способы сделать это.

17
ответ дан 30 November 2019 в 12:21
поделиться

Все экземпляры Объекта или все Типы?

Получение всех экземпляров Объекта было бы достаточно близко к невозможному, и включит непубличную информацию о сканировании через память управления.

Получение всех типов, которые реализуют данный интерфейс, является выполнимым---в данном домене. (т.е., можно найти весь тип определенным в рамках блока, которые реализуют конкретный интерфейс)

  • Загрузка, которой блок
  • Выполняет итерации через, это - типы (назовите asm. GetTypes ())
  • Проверка typeof (IMyInterface).IsAssignibleFrom (testType)
4
ответ дан 30 November 2019 в 12:21
поделиться

Если классы, реализующие указанный интерфейс, принадлежат вам, вы можете реализовать список слабых ссылок после создания экземпляра.

2
ответ дан 30 November 2019 в 12:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: