Подтвердить что ты не робот

Как использовать 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, поэтому я не понимаю, почему это все еще происходит. Как я могу обойти эту проблему?

4b9b3361

Ответ 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();