Использование отражения для поиска конструкторов с параметрами интерфейса - PullRequest
2 голосов
/ 15 февраля 2012

Я загружаю все сборки в моем домене приложения, а затем пытаюсь найти сборки определенного базового типа, а также все, чьи конструкторы имеют интерфейс в качестве аргумента конструктора. У меня есть код ниже, но я не могу понять, как вы говорите, чтобы найти параметры интерфейса.

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

Ответы [ 3 ]

3 голосов
/ 15 февраля 2012

Как насчет этого:

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)
            )
        )
    );
3 голосов
/ 15 февраля 2012
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;
1 голос
/ 15 февраля 2012

для проверки - это класс в подклассе определенного типа, я бы посоветовал вам использовать

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...