Как получить все типы в ссылках, которые реализуют IMyInterface - PullRequest
1 голос
/ 30 августа 2011

У меня есть проект, содержащий много ссылок.
Мне нужно найти все типы, которые реализуют интерфейс IMyInterface.

Я пытался AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes()), но он не вернул все типы в ссылках.

Как мне это сделать?

Ответы [ 3 ]

5 голосов
/ 30 августа 2011

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

Если хотите, вы можете пойти и загрузить сборки с помощью Assembly.Load и проверить их дальше.

Таким образом, возможный фрагмент должен быть

    var types =
        System.Reflection.Assembly.GetExecutingAssembly()
            .GetReferencedAssemblies()
            .SelectMany(name => Assembly.Load(name).GetTypes())
            .Union(AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()));

для поиска типов, реализующих ваш интерфейс:

    var withInterfaces =
        types.Where(t => t.GetInterfaces().Any(i => i == typeof(IDisposable)));

Если это не тот трюк, я тоже потерялся ...

0 голосов
/ 30 августа 2011

Вы пытаетесь сделать это во время выполнения?

Если вам просто нужно знать эту информацию в целом, а это не обязательно во время выполнения, вы можете просто загрузить решение в Visual Studio, а затем щелкнуть правой кнопкой мыши на имени интерфейса в интерфейсе IName {line, а затем выберите «Найти все ссылки» - это должно показать вам все ссылки на интерфейс в вашем коде.

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

0 голосов
/ 30 августа 2011
using System;
using System.Linq;
using System.Reflection;

// try this for fun:
using IMyInterface=System.Collections.IEnumerable;

namespace TestThat
{
    class MainClass
    {

        public static void Main (string[] args)
        {
            var x = AppDomain.CurrentDomain.GetAssemblies()
                .SelectMany(a => a.GetTypes())
                .Where(t => typeof(IMyInterface).IsAssignableFrom(t))
                .Where(t => !(t.IsAbstract || t.IsInterface))
                .Except(new [] { typeof(IMyInterface) });

            Console.WriteLine(string.Join("\n", x.Select(y=>y.Name).ToArray()));

        }
    }
}

Если вы ищете производные классы и хотите пропустить базовый класс:

            .Except(new [] { typeof(MyBaseClass) });

Обнаружен ваш интерфейс.Я посмотрю, почему вы не получаете все типы ссылок.Я ожидал, что твой код сделает это, Брб.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...