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

В данном пространстве имен у меня есть набор classов, которые реализуют интерфейс. Назовем это ISomething . У меня есть еще один class (назовем его CClass ), который знает об ISomething но не знает о classах, которые реализуют этот интерфейс.

Я бы хотел, чтобы CClass искал всю реализацию ISomething , ISomething экземпляр экземпляра и выполнял этот метод.

Кто-нибудь имеет представление о том, как это сделать с C # 3.5?

6 Solutions collect form web for “Как найти все classы, реализующие данный интерфейс?”

Рабочий пример-образец:

 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 преуспел.

Вы можете получить список загруженных сборок, используя это:

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

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

 Type[] types = assembly.GetExportedTypes(); 

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

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

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

Пример использования Linq:

 var types = myAssembly.GetTypes() .Where(m => m.IsClass && m.GetInterface("IMyInterface") != null); 
 foreach (Type t in Assembly.GetCallingAssembly().GetTypes()) { if (t.GetInterface("ITheInterface") != null) { ITheInterface executor = Activator.CreateInstance(t) as ITheInterface; executor.PerformSomething(); } } 

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

 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(); } } 

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

Может быть, нам стоит пойти так

 foreach ( var instance in Assembly.GetExecutingAssembly().GetTypes().Where(a => a.GetConstructor(Type.EmptyTypes) != null).Select(Activator.CreateInstance).OfType() ) instance.Execute(); 
  • Есть ли способ «переопределить» метод с reflectionм?
  • Gson TypeToken с динамическим типом ArrayList
  • Как я могу оценивать выражение C # динамически?
  • Избегание instanceof в Java
  • Как скрыть общественные методы от intellisense
  • ClassCastException при литье в один class
  • Как получить имена параметров метода в Java 8 с использованием отражения?
  • Установка свойства путем отражения со строковым значением
  • Получить экземпляр объекта-компаньона с новым API-интерфейсом Scala reflection
  • Получить экземпляр нового объекта из типа
  • Создание экземпляра с использованием имени classа и вызывающего конструктора
  • Давайте будем гением компьютера.