界面的实现通过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之前你必须显式地加载程序集。