Есть ли способ узнать, какие классы .NET реализуют определенный интерфейс? - PullRequest
3 голосов
/ 16 июля 2009

Например, если я хотел посмотреть, какие у меня были варианты .NET для чего-то, реализующего IList или IDictionary. Есть ли способ найти это, например, в документации MSDN?

Ответы [ 5 ]

5 голосов
/ 16 июля 2009

Я думаю, что это возможно, используя Отражатель

3 голосов
/ 16 июля 2009

Вы также можете сделать это программно.

Если вам известна сборка, в которой расположены типы (я использую mscorlib, поскольку именно там находится string), вы можете создать список, используя этот метод:

.Net 3.0

List<Type> implementors = 
   Assembly.GetAssembly(typeof(string))
    .GetTypes()
    .Where(type => type.GetInterfaces().Contains(typeof(IList)))
    .ToList();

.Net 2.0

List<Type> implementors = new List<Type>();

foreach (Type type in Assembly.GetAssembly(typeof(string)).GetTypes())
{
    foreach (Type interfaceType in type.GetInterfaces())
    {
        if (interfaceType == typeof(IList))
        {
            implementors.Add(type);
        }
    }
}

Список implementors будет содержать список Types, который реализует интерфейс IList. Вы можете изменить IList на любой интерфейс, который вам нужен, IDictionary, ICollection и т. Д.

Edit:

Если вы хотите распространить это на все сборки в текущем AppDomain, вы можете сделать:

List<Type> implementors = 
AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(assembly => assembly.GetTypes()
                        .Where(type => type.GetInterfaces().Contains(typeof(IList)))
            ).ToList();

Все зависит от того, что вы делаете с данными. Если вы просто хотите просмотреть их для своего личного удовольствия, Reflector будет вашим самым простым вариантом, особенно если вы хотите посмотреть за пределы сборок, загруженных в домен приложения (при условии, что у вас есть приложение для начала ). Я полагаю, что в этом случае вы могли бы загрузить все сборки из GAC ... но это в основном то, что делает Reflector , за исключением того, что вы можете выбирать, какие из них вы хотите индивидуально.

3 голосов
/ 16 июля 2009

Чтобы найти его в MSDN, я обычно захожу в Google, набираю что-то вроде «MSDN IList» и попадаю на Интерфейс IList , в котором есть раздел «Классы, реализующие IList». Это верно для любого из классов интерфейса.

Если вы найдете базовый класс, такой как DictionaryBase , будет ссылка под названием Производные классы , которая приведет вас к дереву, отображающему иерархию наследования .

1 голос
/ 16 июля 2009

С помощью этого метода вы можете искать интерфейсы, которые реализует определенный тип:

http://msdn.microsoft.com/en-us/library/system.type.getinterfaces.aspx

Должен сделать трюк

0 голосов
/ 16 июля 2009

У вас есть конкретный вариант использования? С макушки головы ты можешь использовать:

System.Collections.ArrayList (or derived)
System.Collections.ObjectModel.Collection<T> derived
System.Collections.CollectionBase derived
System.Collections.DictionaryBase derived
System.Collections.Hashtable (or derived)
...