Неверная реализация интерфейса - PullRequest
1 голос
/ 08 октября 2010

Я пытался создать модуль, похожий на командную строку.Каждый модуль может содержать несколько команд.Например, «Модуль A» может иметь такие команды, как «выход» и «эхо».Я использую следующий код для загрузки и инициализации моих модулей ...

foreach (string Filename in Directory.GetFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Modules"), "*.dll"))
{
    Assembly Asm = Assembly.LoadFrom(Filename);
    foreach (Type AsmType in Asm.GetTypes())
    {
        if (AsmType.GetInterface("ICommandModule") != null)
        {
            object CommandObject = Activator.CreateInstance(AsmType);
            ICommandModule CommandModule;
            if (CommandObject is ICommandModule)
            {
                CommandModule = (ICommandModule)CommandObject;
            }
            else
            {
                throw new Exception("CommandObject is not a valid ICommandModule.");
            }
            ...

Я точно знаю, что загружаемый модуль (Core.dll) полностью соответствует интерфейсу ICommandModule.,Когда я проверяю if (CommandObject is ICommandModule), это вызывает исключение.Когда я полностью удалил оператор if, он сказал, что не может привести CommandObject к ICommandModule.

Ответы [ 4 ]

1 голос
/ 08 октября 2010

Ваше приложение может находить сборку с ICommandModule в двух разных каталогах.Сборки могут быть абсолютно одинаковыми, но поскольку они находятся в разных каталогах, система типов видит их как разные.

1 голос
/ 08 октября 2010

Примите предложение Якуба и внесите следующие изменения:

ICommandModule CommandModule = Activator.CreateInstance(AsmType) as ICommandModule;

Возможно, вы столкнулись с ситуацией, когда Activator.CreateInstance (AsmType) возвращает значение NULL. Если это так, возможно, он нашел объявление для самого интерфейса, и создание экземпляра для этого конкретного AsmType невозможно. Поэтому при отладке убедитесь, что вы точно знаете, какой тип вы пытаетесь создать.

1 голос
/ 08 октября 2010

Вы можете использовать Отражение , чтобы проверить, реализует ли объект определенный интерфейс.

Вот пример:

bool isCommandModule = typeof(ICommandModule).IsAssignableFrom(commandObject);

Связанные ресурсы:

0 голосов
/ 08 октября 2010

Попробуйте:

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