Вызовите метод интерфейса объекта - PullRequest
0 голосов
/ 21 января 2019

У меня есть следующий интерфейс:

public interface IPropertyEditor
{
    string GetHTML();
    string GetCSS();
    string GetJavaScript();
}

Я хочу получить все классы, которые наследуются от IPropertyEditor, вызвать методы и получить возвращаемые значения.

Я пыталсяи лучшее, что я сделал с помощью поиска: следующее:

var type = typeof(IPropertyEditor);
var types = AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany(s => s.GetTypes())
    .Where(p => type.IsAssignableFrom(p));

foreach (var item in types)
{
    string html = (string)item.GetMethod("GetHTML").Invoke(Activator.CreateInstance(item, null), null);
}

Проблема в том, что он выдает следующее исключение:

MissingMethodException: Constructor on type 'MyAdmin.Interfaces.IPropertyEditor' not found.

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

Как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

вам нужно освободить IPropertyEditor (само) от types

var type = typeof(IPropertyEditor);
var types = AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany(s => s.GetTypes())
    .Where(p => p.IsClass && !p.IsAbstract && type.IsAssignableFrom(p));

foreach (var item in types)
{
    string html = (string)item.GetMethod("GetHTML").Invoke(Activator.CreateInstance(item, null), null);
}

если вы уверены, что не существует абстрактного метода, вы также можете использовать

.Where(p => p != type && type.IsAssignableFrom(p));
0 голосов
/ 21 января 2019

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

.Where(p => 
    p.IsClass &&
    !p.IsAbstract &&
    type.IsAssignableFrom(p));

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

...