界面的实现通过Reflection

如何通过在C#中reflection来获取接口的所有实现?

答案是这样的; 它将search整个应用程序域 – 也就是说,当前由应用程序加载的每个程序集。

/// <summary> /// Returns all types in the current AppDomain implementing the interface or inheriting the type. /// </summary> public static IEnumerable<Type> TypesImplementingInterface(Type desiredType) { return AppDomain .CurrentDomain .GetAssemblies() .SelectMany(assembly => assembly.GetTypes()) .Where(type => desiredType.IsAssignableFrom(type)); } 

它是这样使用的;

 var disposableTypes = TypesImplementingInterface(typeof(IDisposable)); 

您可能还希望使用此函数来查找实际的具体types,即筛选出摘要,接口和genericstypes定义。

 public static bool IsRealClass(Type testType) { return testType.IsAbstract == false && testType.IsGenericTypeDefinition == false && testType.IsInterface == false; } 

看看Assembly.GetTypes()方法。 它返回在程序集中可以find的所有types。 你所要做的就是迭代每一个返回的types,并检查它是否实现了必要的接口。

在这样做的方式是使用Type.IsAssignableFrom方法。

这里是例子。 myInterface是您正在search的接口的实现。

 Assembly myAssembly; Type myInterface; foreach (Type type in myAssembly.GetTypes()) { if (myInterface.IsAssignableFrom(type)) Console.WriteLine(type.FullName); } 

我相信这不是一个解决问题的非常有效的方法,但至less这是一个开始的好地方。

 Assembly assembly = Assembly.GetExecutingAssembly(); List<Type> types = assembly.GetTypes(); List<Type> childTypes = new List<Type>(); foreach (Type type in Types) { foreach (Type interfaceType in type.GetInterfaces()) { if (interfaceType.Equals(typeof([yourinterfacetype)) { childTypes.Add(type) break; } } } 

也许这样的事情….

如Simon Farrow所build议的,这里有一些Type扩展方法可能对此有用。 这个代码只是被接受的答案的重组。

 /// <summary> /// Returns all types in <paramref name="assembliesToSearch"/> that directly or indirectly implement or inherit from the given type. /// </summary> public static IEnumerable<Type> GetImplementors(this Type abstractType, params Assembly[] assembliesToSearch) { var typesInAssemblies = assembliesToSearch.SelectMany(assembly => assembly.GetTypes()); return typesInAssemblies.Where(abstractType.IsAssignableFrom); } /// <summary> /// Returns the results of <see cref="GetImplementors"/> that match <see cref="IsInstantiable"/>. /// </summary> public static IEnumerable<Type> GetInstantiableImplementors(this Type abstractType, params Assembly[] assembliesToSearch) { var implementors = abstractType.GetImplementors(assembliesToSearch); return implementors.Where(IsInstantiable); } /// <summary> /// Determines whether <paramref name="type"/> is a concrete, non-open-generic type. /// </summary> public static bool IsInstantiable(this Type type) { return !(type.IsAbstract || type.IsGenericTypeDefinition || type.IsInterface); } 

例子

在调用程序集中获取可实例化的实现者:

 var callingAssembly = Assembly.GetCallingAssembly(); var httpModules = typeof(IHttpModule).GetInstantiableImplementors(callingAssembly); 

要获得当前AppDomain中的实现者:

 var appDomainAssemblies = AppDomain.CurrentDomain.GetAssemblies(); var httpModules = typeof(IHttpModule).GetImplementors(appDomainAssemblies); 

你的意思是一个types实现的所有接口?

喜欢这个:

 ObjX foo = new ObjX(); Type tFoo = foo.GetType(); Type[] tFooInterfaces = tFoo.GetInterfaces(); foreach(Type tInterface in tFooInterfaces) { // do something with it } 

希望帮助。

您必须遍历所有您感兴趣的程序集。从程序集中,您可以获取它所定义的所有types。 请注意,当您执行AppDomain.CurrentDomain.Assemblies时,您只能获取已加载的程序集。 程序集只有在需要的时候才被加载,所以这意味着在开始search之前你必须显式地加载程序集。