有没有一种方法可以找到实现特定接口的.NET类?

4
例如,如果我想查看实现IList或IDictionary的某些内容的.NET选项。 例如在MSDN文档中有没有找到的方法?
5个回答

5

在 Reflector 中搜索接口,然后展开该接口下的派生类型。 - Don Kirkby
确保您告诉反编译器您正在使用的所有程序集。否则,它将无法找到这些实现。 - Daniel Yankowsky

3

您也可以通过编程的方式实现此操作。

如果您知道类型所在的程序集(我正在使用 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列表将保存实现接口IListTypes列表。您可以将IList更改为任何您想要的接口,如IDictionaryICollection等。

编辑:

如果您想将其扩展到当前AppDomain中的所有程序集,可以执行以下操作:

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

这完全取决于你使用数据的方式。如果只想为个人满足查看,那么Reflector将是最简单的选择——特别是如果要查看不在您的应用程序域中加载的程序集(假设您有一个应用程序)。我想在这种情况下,您可以加载GAC中的所有程序集……但这基本上就是Reflector所做的,除了您可以挑选您想要的程序集。

如果还需要考虑其他程序集,那么这将会更加困难......或者有没有一种方法可以扫描所有被视为 .Net Framework 一部分的程序集? - Svish

3
为了在MSDN中找到它,我通常会去谷歌,输入类似于“MSDN IList”的内容,然后进入“IList接口”,这个页面有一个“实现IList的类”章节。对于任何接口类都是如此。
如果你找到一个基类,比如DictionaryBase,那么就会有一个名为“派生类”的链接,它将带您进入一个树形结构,显示继承层次结构

1

我认为问题是在询问相反的情况:所有实现特定接口的类。 - Don Kirkby
我需要相反的方式,有点像这样。 - Svish

0

你有特定的使用情境吗?我能马上想到以下方式:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接