关于c#:如何找到实现给定接口的所有类?

How to find all the classes which implement a given interface?

在给定的名称空间下,我有一组实现接口的类。我们称之为ISomething。我还有另一个类(我们称它为CClass),它知道ISomething,但不知道实现该接口的类。

我希望CClass查找ISomething的所有实现,实例化它的一个实例并执行该方法。

有人知道如何用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();