Приведение класса к базовому интерфейсу через исключение причины отражения - PullRequest
2 голосов
/ 13 декабря 2011

Я загружаю сборку .NET динамически через отражение и получаю все содержащиеся в ней классы (на данный момент один). После этого я пытаюсь привести класс к интерфейсу, который, я уверен, реализует класс на 100%, но я получаю следующее исключение: Невозможно привести объект типа System.RuntimeType к типу MyInterface

MyDLL.dll

public interface MyInterface
{
    void MyMethod();
}

MyOtherDLL.dll

public class MyClass : MyInterface
{
    public void MyMethod()
    {
        ...
    }
}

public class MyLoader
{
    Assembly myAssembly = Assembly.LoadFile("MyDLL.dll");
    IEnumerable<Type> types = extension.GetTypes().Where(x => x.IsClass);

    foreach (Type type in types)
    {
        ((MyInterface)type).MyMethod();
    }
}

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

1 Ответ

3 голосов
/ 13 декабря 2011

Вы пытаетесь преобразовать объект платформы .NET типа Type в созданный вами интерфейс. Объект Type не реализует ваш интерфейс, поэтому он не может быть приведен. Сначала вы должны создать конкретный экземпляр вашего объекта, например, используя Activator, например:

// this goes inside your for loop
MyInterface myInterface = (MyInterface)Activator.CreateInstance(type, false);
myInterface.MyMethod();

В методе CreateInstance есть и другие варианты загрузки, которые могут соответствовать вашим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...