如何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();