Как найти все классы, которые реализуют данный интерфейс?

Возможно, ваша виртуальная машина имеет правило iptables, запрещающее трафику входить в порт 5984. Попробуйте открыть с помощью следующей команды:

iptables -I INPUT -p tcp -m tcp --dport 5984 -j ACCEPT

Если он все еще не работает, попробуйте отключить службу firewalld:

service firewalld stop
66
задан GEOCHET 17 December 2015 в 13:00
поделиться

4 ответа

Рабочий пример кода:

var instances = from t in Assembly.GetExecutingAssembly().GetTypes()
                where t.GetInterfaces().Contains(typeof(ISomething))
                         && t.GetConstructor(Type.EmptyTypes) != null
                select Activator.CreateInstance(t) as ISomething;

foreach (var instance in instances)
{
    instance.Foo(); // where Foo is a method of ISomething
}

Редактирование Добавило проверку на конструктора без параметров так, чтобы вызов к CreateInstance успешно выполнился.

130
ответ дан Matt Hamilton 24 November 2019 в 14:55
поделиться

Использование в качестве примера Linq:

var types =
  myAssembly.GetTypes()
            .Where(m => m.IsClass && m.GetInterface("IMyInterface") != null);
8
ответ дан CMS 24 November 2019 в 14:55
поделиться

Вы могли использовать что-то как следующее и адаптировать его в соответствии с Вашими потребностями.

var _interfaceType = typeof(ISomething);
var currentAssembly = System.Reflection.Assembly.GetExecutingAssembly();
var types = GetType().GetNestedTypes();

foreach (var type in types)
{
    if (_interfaceType.IsAssignableFrom(type) && type.IsPublic && !type.IsInterface)
    {
        ISomething something = (ISomething)currentAssembly.CreateInstance(type.FullName, false);
        something.TheMethod();
    }
}

Этот код мог использовать некоторые улучшения производительности, но это - запуск.

2
ответ дан Quintin Robinson 24 November 2019 в 14:55
поделиться

Можно получить список загруженных блоков при помощи этого:

Assembly assembly = System.Reflection.AppDomain.CurrentDomain.GetAssemblies()

Оттуда, можно получить список типов в блоке (принимающий открытые типы):

Type[] types = assembly.GetExportedTypes();

Затем можно спросить каждый тип, поддерживает ли он тот интерфейс путем нахождения что интерфейс на объекте:

Type interfaceType = type.GetInterface("ISomething");

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

10
ответ дан Ryan Kohn 24 November 2019 в 14:55
поделиться
Другие вопросы по тегам:

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