How to find all the classes which implement a given interface?
在给定的名称空间下,我有一组实现接口的类。我们称之为
我希望
有人知道如何用C 3.5来做吗?
工作代码示例:
1 2 3 4 5 6 7 8 9 | 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 } |
edit添加了对无参数构造函数的检查,以便成功调用CreateInstance。
您可以使用以下命令获取已加载程序集的列表:
1 | Assembly assembly = System.Reflection.AppDomain.CurrentDomain.GetAssemblies() |
从中,可以获得程序集中的类型列表(假定为公共类型):
4然后,您可以通过在对象上查找接口来询问每种类型是否支持该接口:
1 | Type interfaceType = type.GetInterface("ISomething"); |
不确定是否有一种更有效的方法来进行反射。
使用LINQ的示例:
1 2 3 | var types = myAssembly.GetTypes() .Where(m => m.IsClass && m.GetInterface("IMyInterface") != null); |
1 2 3 4 5 6 7 8 | foreach (Type t in Assembly.GetCallingAssembly().GetTypes()) { if (t.GetInterface("ITheInterface") != null) { ITheInterface executor = Activator.CreateInstance(t) as ITheInterface; executor.PerformSomething(); } } |
您可以使用下面这样的工具,并根据您的需要进行调整。
1 2 3 4 5 6 7 8 9 10 11 12 | 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(); } } |
这段代码可以使用一些性能增强,但它是一个开始。
也许我们应该走这边
1 2 | foreach ( var instance in Assembly.GetExecutingAssembly().GetTypes().Where(a => a.GetConstructor(Type.EmptyTypes) != null).Select(Activator.CreateInstance).OfType<ISomething>() ) instance.Execute(); |