Как исправить InvalidCastException для динамического объекта?

ScriptEngine rubyEngine;
//...
dynamic execution_result = rubyEngine.Execute(script, scope);

if (execution_result != null && !silent)
    WriteResponce(execution_result.ToString());

Этот код генерирует InvalidCastException:

Невозможно привести объект типа «SOMELIB.Graphics» к типу «SOMELIB.Object».

Когда происходит сравнение:

результат_выполнения != ноль

Если это сравнение удалено, то execute_result.ToString() выдает такое же исключение.

Я нашел обходной путь:

if (execution_result is SOMELIB.Graphics)
{
    SOMELIB.Graphics g = execution_result as SOMELIB.Graphics;
    WriteResponce(g.ToString());
    return;
}

но я не понимаю, почему появляется это исключение и как его исправить.


person Dmitriy    schedule 08.08.2011    source источник
comment
Хм, странно, что он пытается привести к SOMELIB.Object вместо System.Object   -  person Hans Passant    schedule 08.08.2011
comment
Правильный. Проблема с динамическим типом. ToString() работает, если я динамически привожу к типу объекта:   -  person Dmitriy    schedule 10.08.2011


Ответы (1)


Приведите динамический объект к объекту, чтобы избежать DLR (среда выполнения динамического языка), попробуйте связать метод ToString с его (реальным) типом динамического класса.

ScriptEngine rubyEngine;
//...
dynamic execution_result = rubyEngine.Execute(script, scope);

object result = execution_result as object;
if (result != null && !silent)
    WriteResponce(result.ToString());
person jvitor83    schedule 08.11.2012