近日有朋友在论坛(.Net技术论坛)中问到,如何获取实现某个接口的所有类。这个问题是所有大型项目中经常遇到的问题,有经验的程序员可能会在开发的时候写好配置文档,以方便以后使用,而对于第三方开发的dll或程序则无此遍历了,那我们该怎么办呢?
这里我提供了一种基于msdn上对FindInterfaces的说明来解决这个问题。
思路如下:
首先载入一个类库文件,
//载入dll文件并获取属性AI代码助手复制代码Assembly assembly = Assembly.LoadFile(dllFile); AI代码助手复制代码//取出所有类型集合AI代码助手复制代码Type[] types = assembly.GetTypes();AI代码助手复制代码AI代码助手复制代码
接下来遍历所有类型,为了找到,接口类型。再获取接口的实现类。
1: //遍历类型AI代码助手复制代码 2: foreach (Type type in types) AI代码助手复制代码 3: { AI代码助手复制代码 4: //找到接口AI代码助手复制代码 5: if (type.GetInterface("InterfaceName") != null && !type.IsAbstract) AI代码助手复制代码 6: { AI代码助手复制代码 7: // 这个type就是子类了。AI代码助手复制代码 8: type.GetConstructor(Type.EmptyTypes).Invoke(null); AI代码助手复制代码 9: } AI代码助手复制代码 10: }AI代码助手复制代码
至此,我们的问题得以解决。
以下是结合msdn得出一个实例:
using System; AI代码助手复制代码using System.Collections.Generic; AI代码助手复制代码using System.Text; AI代码助手复制代码using System.Reflection; AI代码助手复制代码AI代码助手复制代码namespace TestGetInterface AI代码助手复制代码{ AI代码助手复制代码class Program AI代码助手复制代码 { AI代码助手复制代码publicstaticbool MyInterfaceFilter(Type typeObj, Object criteriaObj) AI代码助手复制代码 { AI代码助手复制代码if (typeObj.ToString() == criteriaObj.ToString()) AI代码助手复制代码returntrue; AI代码助手复制代码elseAI代码助手复制代码returnfalse; AI代码助手复制代码 } AI代码助手复制代码staticvoid Main(string[] args) AI代码助手复制代码 { AI代码助手复制代码 Assembly assembly = Assembly.LoadFile(@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll");//你的loadfileAI代码助手复制代码 Type[] types = assembly.GetTypes(); AI代码助手复制代码 TypeFilter myFilter = new TypeFilter(MyInterfaceFilter); AI代码助手复制代码//String[] myInterfaceList = new String[2] AI代码助手复制代码// {"System.Collections.IEnumerable", AI代码助手复制代码// "System.Collections.ICollection"};AI代码助手复制代码 String[] myInterfaceList = new String[1] AI代码助手复制代码 { AI代码助手复制代码 "System.Collections.ICollection"};//支持ICollectionAI代码助手复制代码foreach (Type type in types) AI代码助手复制代码 { AI代码助手复制代码for (int index = 0; index < myInterfaceList.Length; index++) AI代码助手复制代码 { AI代码助手复制代码 Type[] myInterfaces = type.FindInterfaces(myFilter, AI代码助手复制代码 myInterfaceList[index]); AI代码助手复制代码if (myInterfaces.Length > 0) AI代码助手复制代码 { AI代码助手复制代码 Console.WriteLine("\n{0} implements the interface {1}.", AI代码助手复制代码 type, myInterfaceList[index]); AI代码助手复制代码for (int j = 0; j < myInterfaces.Length; j++) AI代码助手复制代码 Console.WriteLine("Interfaces supported: {0}.", AI代码助手复制代码 myInterfaces[j].ToString()); AI代码助手复制代码 } AI代码助手复制代码//elseAI代码助手复制代码// Console.WriteLine(AI代码助手复制代码// "\n{0} does not implement the interface {1}.",AI代码助手复制代码// type, myInterfaceList[index]);AI代码助手复制代码 } AI代码助手复制代码 } AI代码助手复制代码 Console.ReadLine(); AI代码助手复制代码 } AI代码助手复制代码 } AI代码助手复制代码AI代码助手复制代码AI代码助手复制代码 }AI代码助手复制代码AI代码助手复制代码AI代码助手复制代码AI代码助手复制代码
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。