Как использовать Debug.Write с динамическими данными?
Я делаю некоторые скрипты Adobe InDesign. Их реализация COM действительно предназначена для VB, поэтому она не является строгой по отношению к сообщениям о типах данных, из-за чего иногда требуется использование динамики.
Я пытаюсь отладить фрагмент кода, который выглядит так:
foreach (dynamic pi in current.PageItems)
{
if (pi is TextFrame)
{
var frame = pi as TextFrame;
var str = frame.Contents.ToString();
Debug.WriteLine(str);
}
}
Это дает мне RuntimeBinderException следующим образом:
Дополнительная информация: Невозможно динамически вызывать метод 'WriteLine' потому что он имеет условный атрибут
Я понимаю, что проблема заключается в том, что с условными атрибутами версия кода, которая должна обрабатывать тип, который динамический разрешает во время выполнения, может быть скомпилирована, но я явно конвертирую то, что хочу отлаживать string, поэтому я не понимаю, почему это все еще происходит. Как я могу обойти эту проблему?
Ответы
Ответ 1
Вы укушены своим использованием var
здесь, я думаю.
Я предполагаю, что Contents
есть dynamic
.
Рассмотрим следующий пример:
dynamic d = null;
var s = d.ToString();
s
dynamic
not string
.
Вы хотите передать объект object
перед вызовом ToString
или передать результат ToString
в string
. Дело в том, что в какой-то момент вам нужно бросить, чтобы выйти из цикла dynamic
.
Вот как я решил:
string str = ((object)frame.Contents).ToString();
Debug.WriteLine(str);
или
string str = frame.Contents.ToString() as string;
Debug.WriteLine(str);
Ответ 2
но я явно конвертирую то, что хочу отлаживать, в строку
На самом деле это не так.
var str = frame.Contents.ToString();
Эта строка все еще полностью динамична.
Вам нужно явно объявить его как string
.
В качестве альтернативы, вы можете статически-ize ранее, явно объявив frame
как TextFrame
.
Ответ 3
Никто так и не сказал этого, поэтому я буду.
Измените
var str = frame.Contents.ToString();
to
string str = frame.Contents.ToString();