如何find所有实现给定接口的类?
在给定的命名空间下,我有一组实现接口的类。 我们把它称为ISomething
。 我有另一个类(我们称之为CClass
),它知道ISomething
但不知道实现该接口的类。
我希望该CClass
查找所有的ISomething
的实现,实例化它的一个实例并执行该方法。
有没有人有关于如何使用C#3.5做到这一点的想法?
工作代码示例:
var instances = from t in Assembly.GetExecutingAssembly().GetTypes() where t.GetInterfaces().Contains(typeof(ISomething)) && t.GetConstructor(Type.EmptyTypes) != null select Activator.CreateInstance(t) as ISomething; foreach (var instance in instances) { instance.Foo(); // where Foo is a method of ISomething }
编辑添加了无参数构造函数的检查,以便对CreateInstance的调用成功。
你可以通过使用这个获得一个加载的程序集列表:
Assembly assembly = System.Reflection.AppDomain.CurrentDomain.GetAssemblies()
从那里,你可以得到程序集中的types列表(假设公共types):
Type[] types = assembly.GetExportedTypes();
然后你可以通过查找对象上的接口来询问每种types是否支持该接口:
Type interfaceType = type.GetInterface("ISomething");
不知道是否有一个更有效的方式来反思。
一个使用Linq的例子:
var types = myAssembly.GetTypes() .Where(m => m.IsClass && m.GetInterface("IMyInterface") != null);
foreach (Type t in Assembly.GetCallingAssembly().GetTypes()) { if (t.GetInterface("ITheInterface") != null) { ITheInterface executor = Activator.CreateInstance(t) as ITheInterface; executor.PerformSomething(); } }
你可以使用像下面这样的东西,并根据你的需要定制它。
var _interfaceType = typeof(ISomething); var currentAssembly = System.Reflection.Assembly.GetExecutingAssembly(); var types = GetType().GetNestedTypes(); foreach (var type in types) { if (_interfaceType.IsAssignableFrom(type) && type.IsPublic && !type.IsInterface) { ISomething something = (ISomething)currentAssembly.CreateInstance(type.FullName, false); something.TheMethod(); } }
这个代码可以使用一些性能增强,但这是一个开始。
也许我们应该走这条路
foreach ( var instance in Assembly.GetExecutingAssembly().GetTypes().Where(a => a.GetConstructor(Type.EmptyTypes) != null).Select(Activator.CreateInstance).OfType<ISomething>() ) instance.Execute();