Получение всего объекта, реализующего интерфейс внутри приложения - PullRequest
2 голосов
/ 15 ноября 2010

Мне нужно получить все объекты в моем приложении, которые реализуют данный интерфейс.Как я могу достичь этого?

Спасибо

Чтобы уточнить, я ищу примеры НЕ для типов.


Чтобы уточнить еще раз, я думаю, мне нужносделать что-нибудь плохое, например, получить все потоки, связанные с моим AppDomain, и пройтись по их стекам.

Опять же - идея моего босса ... я думал об использовании IOC или AOP ....

Ответы [ 4 ]

3 голосов
/ 15 ноября 2010

Будет выполнен поиск всех загруженных сборок.

AppDomain myDomain = AppDomain.CurrentDomain;
Assembly[] loadedAssemblies = MyDomain.GetAssemblies();
foreach(Assembly assembly in loadedAssemblies)
{
    Type[] types = assembly.GetTypes();
    foreach (Type type in types)
    {
        if (type.GetInterface(interface name) != null)
            Console.WriteLine(type.Name);
    }
}
2 голосов
/ 15 ноября 2010

Это невозможно сделать.

Чтобы найти объект, вам нужна ссылка на него. Если у вас нет ссылки на нее, но вы хотите ее «найти», это невозможно.

1 голос
/ 15 ноября 2010

Один из способов сделать это - использовать MEF, и он, вероятно, будет работать лучше, чем при использовании стандартного отражения.

http://mef.codeplex.com/

Вы в основном добавляете атрибут ко всем реализациям вашего интерфейса, а затем MEF может сканировать ваши сборки (и любые другие в любых папках, которые вы указали для сканирования) на наличие реализаций.

0 голосов
/ 15 ноября 2010

Итак, вы хотите найти все экземпляры, которые реализуют определенный интерфейс - не классы, а реальные объекты. Вам нужно как-то перечислить экземпляры объектов. Я не знаю, как это сделать.

Однако, если вы можете создать своего рода общего предка для всех соответствующих объектов, которые у вас есть (что-то вроде вашего Object класса), вы можете добавить статическое перечисление всех экземпляров создается путем регистрации их в конструкторе. Затем вы можете просто запустить их и проверить каждый экземпляр, чтобы увидеть, реализует ли он интерфейс. Проблема с этим подходом заключается, конечно, в том, что эти экземпляры никогда не будут собирать мусор, даже когда вы их используете, потому что у них всегда есть ссылка, указывающая на них.

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

надеюсь, что поможет: -)

...