通过反射实现接口
时间:2020-03-05 18:58:00 来源:igfitidea点击:
如何通过C#中的反射获取接口的所有实现?
解决方案
回答
我们是说Type实现的所有接口吗?
像这样:
ObjX foo = new ObjX(); Type tFoo = foo.GetType(); Type[] tFooInterfaces = tFoo.GetInterfaces(); foreach(Type tInterface in tFooInterfaces) { // do something with it }
希望有帮助。
回答
看看Assembly.GetTypes()
方法。它返回可在程序集中找到的所有类型。我们要做的就是遍历每个返回的类型,并检查其是否实现了必要的接口。
这样做的一种方式是使用Type.IsAssignableFrom方法。
这是例子。 " myInterface"是我们要搜索其实现的接口。
Assembly myAssembly; Type myInterface; foreach (Type type in myAssembly.GetTypes()) { if (myInterface.IsAssignableFrom(type)) Console.WriteLine(type.FullName); }
我确实认为这不是解决问题的有效方法,但是至少,这是一个很好的起点。
回答
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; } } }
也许像那样...
回答
答案是这样;它会搜索整个应用程序域-即应用程序当前加载的每个程序集。
/// <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));
我们可能还希望此函数查找实际的具体类型-即过滤掉抽象,接口和通用类型定义。
public static bool IsRealClass(Type testType) { return testType.IsAbstract == false && testType.IsGenericTypeDefinition == false && testType.IsInterface == false; }
回答
我们必须遍历所有我们感兴趣的程序集。我们可以从程序集中获取其定义的所有类型。请注意,当我们执行AppDomain.CurrentDomain.Assemblies时,只会得到已加载的程序集。直到需要时才加载装配件,这意味着我们必须在开始搜索之前显式加载装配件。