@michadimin

Как перечислить все классы, реализованные через некоторый интерфейс?

Порывшись в инете - нашёл такое решение

Type ourtype = typeof(HashAlgorithm); // Базовый тип
IEnumerable<Type> list = Assembly.GetAssembly(ourtype).GetTypes().Where(type => type.IsSubclassOf(ourtype));

foreach(Type itm in list){
    Console.WriteLine(itm);
}


Однако это работает только для классов, а если указать в качестве типа интерфейс, то он не видит ни одного реализованного класса, хотя у меня их целых 3.
  • Вопрос задан
  • 134 просмотра
Решения вопроса 1
@michadimin Автор вопроса
Спустя немного времени - нашёл такое решение

public static IEnumerable<Type> GetInterfaceTypes<T>()
    {
        var type = typeof(T);
        var types = AppDomain.CurrentDomain.GetAssemblies()
            .SelectMany(s => s.GetTypes())
            .Where(p => type.IsAssignableFrom(p));

        return types;
    }


Если вы простой обыватель и отчаянно ищите способа быстрее решить проблему, то вот пример использования:
interface ITest1
{

}

interface ITest2 : ITest1
{

}

interface ITest3 : ITest2
{

}

class TestClass1
{

}

class TestClass2 : TestClass1
{

}

static class Extensions
{
    public static IEnumerable<Type> GetInheritedTypes<T>()
    {
        var type = typeof(T);
        var types = AppDomain.CurrentDomain.GetAssemblies()
            .SelectMany(s => s.GetTypes())
            .Where(p => type.IsAssignableFrom(p));

        return types;
    }
}

class Prog
{
    public static void Main()
    {
        foreach (var i in Extensions.GetInheritedTypes<TestClass1>()) //В треугольных скобочках указывается тип, наледников которого вы хотите получить
            Console.WriteLine(i);
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы