C # - получить все интерфейсы из папки в сборке - PullRequest
5 голосов
/ 13 апреля 2011

У меня есть несколько сервисов WCF, и у меня есть список сервисных контрактов (интерфейсов) в сборке в определенной папке.Я знаю пространство имен, и оно будет выглядеть примерно так:

MyProject.Lib.ServiceContracts

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

Возможно ли вышеизложенное?Если да, какой-нибудь совет о том, как сделать выше?

Спасибо за любую помощь.

Ответы [ 3 ]

15 голосов
/ 13 апреля 2011

Это должно дать вам все такие интерфейсы :

    string directory = "/";
    foreach (string file in Directory.GetFiles(directory,"*.dll"))
    {
        Assembly assembly = Assembly.LoadFile(file);
        foreach (Type ti in assembly.GetTypes().Where(x=>x.IsInterface))
        {
            if(ti.GetCustomAttributes(true).OfType<ServiceContractAttribute>().Any())
            {
                // ....

            }
        } 
    }
1 голос
/ 13 апреля 2011

@ Aliostad ответ уже опубликован, но я добавлю свой, а также думаю, что он будет немного более тщательным ...

// add usings:
          // using System.IO;
          // using System.Reflection;
          public Dictionary<string,string> FindInterfacesInDirectory(string directory)
          {
             //is directory real?
             if(!Directory.Exists(directory))
             {
                //exit if not...
                throw new DirectoryNotFoundException(directory);
             }

             // set up collection to hold file name and interface name
             Dictionary<string, string> returnValue = new Dictionary<string, string>();

             // drill into each file in the directory and extract the interfaces
             DirectoryInfo directoryInfo = new DirectoryInfo(directory);
             foreach (FileInfo fileInfo in directoryInfo.GetFiles() )
             {
                foreach (Type type in Assembly.LoadFile(fileInfo.FullName).GetTypes())
                {
                   if (type.IsInterface)
                   {
                      returnValue.Add(fileInfo.Name, type.Name);
                   }
                }
             }

             return returnValue;

          }
0 голосов
/ 25 декабря 2016

Приведенные выше ответы могут работать некорректно для сборок, созданных с помощью C ++ / CLI (т. Е. Сборки с обоими управляемыми / неуправляемыми кодами).

Я предлагаю заменить эту строку:

foreach (Type ti in assembly.GetTypes().Where(x=>x.IsInterface))

с этой строкой:

foreach (Type ti in assembly.GetExportedTypes().Where(x=>x.IsInterface))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...