问题描述
程序结构如下ns.IUser(接口)ns.BigUsers(类)ns.SmallUsers(类)ns.Users(类)现在想写个方法publicArrayList<IUser>GetAllUsers(stringinterfaceName){ArrayList<IUser>ay=newArrayList<IUser>();ay.add(newBigUsers());ay.add(newSmallUsers());ay.add(newUsers());returnay;}有没有人能写出个动态的。根据接口名能得到实现此接口的所有类的实例的集合呀?谢谢。
解决方案
解决方案二:
我举得这个估计够呛吧。
解决方案三:
先用反射获取所有命名空间下面所有成员遍历这些成员看这些成员是否实现了指定接口如果试下了就实例化这中类型的成员
解决方案四:
反射有这个功能么?
解决方案五:
引用2楼的回复:
先用反射获取所有命名空间下面所有成员遍历这些成员看这些成员是否实现了指定接口如果试下了就实例化这中类型的成员
说的真轻松啊,你反射获得一下命名空间下的所有成员试试。回到正题。这个问题的难点在于取到一个命名空间下的所有类。因为命名空间并不是一个逻辑结构,只是类似于一种名字前缀。所以只能通过遍历当前加载的所有DLL的所有类成员来找到命名空间下当前的所有类成员。当有新DLL被加载之后,就可能会有新的成员出现。
解决方案六:
classProgram{staticvoidMain(string[]args){varasm=Assembly.Load("4.0Test");vartypes=asm.GetTypes();varinstances=newList<IA>();foreach(vartempintypes){vartempInterface=temp.GetInterface("IA");if(tempInterface!=null&&tempInterface==typeof(IA)){varinstance=Activator.CreateInstance(temp);if(instanceisIA){instances.Add(instanceasIA);}}}Console.Read();}}publicinterfaceIA{}publicclassB:IA{}publicclassC:IA{}
解决方案七:
把方法提取出来了你看下usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;usingSystem.Reflection;namespace_4._0Test{classProgram{staticvoidMain(string[]args){vartemp=GetInstance("IA");Console.Read();}publicstaticList<IA>GetInstance(stringinterfaceName){varasm=Assembly.Load("4.0Test");//改成你的程序集名称或者路劲vartypes=asm.GetTypes();varinstances=newList<IA>();foreach(vartempintypes){vartempInterface=temp.GetInterface(interfaceName);if(tempInterface!=null&&tempInterface==typeof(IA)){varinstance=Activator.CreateInstance(temp);if(instanceisIA){instances.Add(instanceasIA);}}}returninstances;}}publicinterfaceIA{}publicclassB:IA{}publicclassC:IA{}}