Возможно, ваша виртуальная машина имеет правило iptables
, запрещающее трафику входить в порт 5984
. Попробуйте открыть с помощью следующей команды:
iptables -I INPUT -p tcp -m tcp --dport 5984 -j ACCEPT
Если он все еще не работает, попробуйте отключить службу firewalld
:
service firewalld stop
Рабочий пример кода:
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 успешно выполнился.
Использование в качестве примера Linq:
var types =
myAssembly.GetTypes()
.Where(m => m.IsClass && m.GetInterface("IMyInterface") != null);
Вы могли использовать что-то как следующее и адаптировать его в соответствии с Вашими потребностями.
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();
}
}
Этот код мог использовать некоторые улучшения производительности, но это - запуск.
Можно получить список загруженных блоков при помощи этого:
Assembly assembly = System.Reflection.AppDomain.CurrentDomain.GetAssemblies()
Оттуда, можно получить список типов в блоке (принимающий открытые типы):
Type[] types = assembly.GetExportedTypes();
Затем можно спросить каждый тип, поддерживает ли он тот интерфейс путем нахождения что интерфейс на объекте:
Type interfaceType = type.GetInterface("ISomething");
Не уверенный, если существует более эффективный способ сделать это с отражением.