可能重复:
Getting all types that implement an interface with C# 3.5
How to find what class(es) implements an interface (.Net)
这在C#中是否可能像Java一样?
如果我有一个接口名称(参数IDataReader),我该如何获得实现它的所有类的列表?
在java中,它列在API中 - 这是否在C#中可用
答案 0 :(得分:5)
如果您使用ReSharper,则可以右键单击类或方法标识符,然后选择“转到继承者”,它将显示该类的所有实现的列表或方法
默认情况下,Visual Studio没有此功能。如果您没有ReSharper,可以通过编译.dll并在Reflector中分析它们来实现。
答案 1 :(得分:4)
您可以使用Reflector查找已加载的程序集的派生类型。
答案 2 :(得分:4)
如果您正在谈论在开发时浏览程序集,那么像Reflector(如Agent_9191建议)这样的静态分析工具是您最好的选择。如果您希望在运行时执行此操作,那么反射就是最佳选择。无论哪种方式,您都需要定义搜索范围:您想要查看哪些程序集?
在开发时,这可能很容易,而Reflector可以让您通过将程序集加载到其查看器中来轻松指定这些内容。在运行时,这可能更困难。为了避免贪婪地加载各种其他无用的程序集,我假设您要浏览所有当前加载的程序集,但这可能不正确。出于这个原因,我将把它分解为两个函数:
public static IEnumerable<Type> GetImplementations(Type interfaceType)
{
// this will load the types for all of the currently loaded assemblies in the
// current domain.
return GetImplementations(interfaceType, AppDomain.CurrentDomain.GetAssemblies());
}
public static IEnumerable<Type> GetImplementations(Type interfaceType, IEnumerable<Assembly> assemblies)
{
return assemblies.SelectMany(
assembly => assembly.GetExportedTypes()).Where(
t => interfaceType.IsAssignableFrom(t)
);
}
答案 3 :(得分:1)
给定类型列表,您可以使用Type.IsAssignableFrom查找实现给定接口的类:
IEnumerable<Type> types = Assembly.LoadFrom("assemblyPath").GetTypes();
var impls = types.Where(t => typeof(TargetInterface).IsAssignableFrom(t) && t.IsClass);
答案 4 :(得分:0)
您可以使用反射来查看特定的程序集并遍历其所有类型,以确定它的IDataReader等。我不一定会在大多数情况下推荐这个,我不相信内置任何内容。< / p>