使用反射查找具有接口参数的构造函数



我正在加载我的应用程序域中的所有程序集,然后试图找到特定基类型的程序集,以及所有构造函数都有一个接口作为构造函数参数的程序集。我有下面的代码,但不知道如何告诉它查找接口参数。

var assembliesWithPluginBaseInThem = AppDomain.CurrentDomain.GetAssemblies()
    .Where(x=>x.GetTypes().Where(y=>y.BaseType== typeof(PluginBase) &&
     y.GetConstructor(new Type[]{typeof(interface)})

这样的东西怎么样:

var assembliesWithPluginBaseInThem = AppDomain.CurrentDomain.GetAssemblies()
    .Where(x =>
        x.GetTypes().Any(y =>
            typeof(PluginBase).IsAssignableFrom(y) &&
            y.GetConstructors().Any(z =>
                z.GetParameters().Count() == 1 && // or maybe you don't want exactly 1 param?
                z.GetParameters().All(a => a.ParameterType.IsInterface)
            )
        )
    );
var types =
    from a in AppDomain.CurrentDomain.GetAssemblies()
    from t in a.GetTypes()
    where t.GetConstructors()
                 .Any(c => c.GetParameters()
                              .Any(p => p.ParameterType.IsInterface))
    select t;

要检查某个类型的子类中是否有一个类,我建议您使用

yourClass.IsSubclassOf(typeof(parentClass))

所以它应该看起来像下面这样:

var assembliesWithPluginBaseInThem = AppDomain.CurrentDomain.GetAssemblies()
    .Where(x=>x.GetTypes().Where(y=>y.IsSubclassOf(typeof(PluginBase)) &&
     y.GetConstructor.Any(c => c.GetParameters()
                              .Any(p => p.ParameterType.IsInterface)

最新更新