Wie kann ich Debug.Write mit dynamischen Daten verwenden?

Ich mache ein Scripting von Adobe InDesign. Ihre COM-Implementierung ist wirklich auf VB ausgelegt. Daher ist es nicht streng, Datentypen zu melden, was gelegentlich die Verwendung von Dynamik erfordert.

Ich versuche, einen Codeblock zu debuggen, der so aussieht:

foreach (dynamic pi in current.PageItems) { if (pi is TextFrame) { var frame = pi as TextFrame; var str = frame.Contents.ToString(); Debug.WriteLine(str); } } 

Dies gibt mir eine RuntimeBinderException wie folgt:

Zusätzliche Informationen: Die Methode ‘WriteLine’ kann nicht dynamisch aufgerufen werden, da sie ein Bedingungsattribut enthält

Ich verstehe, dass das Problem darin besteht, dass mit bedingten Attributen die Version des Codes, die den Typ handhaben muss, zu dem die Dynamik zur Laufzeit aufgetriggers wird, möglicherweise kompiliert wurde, aber ich konvertiere explizit, was ich in einen String debuggen möchte Ich kann nicht verstehen, warum das immer noch geschieht. Wie kann ich dieses Problem umgehen?

Sie werden von var hier gebissen, ist meine Vermutung.

Ich gehe davon aus, dass der Contents dynamic .

Betrachten Sie dieses Beispiel:

 dynamic d = null; var s = d.ToString(); 

s ist dynamic nicht string .

Sie möchten das Objekt in ein object ToString , bevor Sie ToString aufrufen, oder das Ergebnis von ToString in einen string ToString . Der Punkt ist, dass irgendwann irgendwo ein Cast benötigt wird, um den dynamic Zyklus zu verlassen.

So würde ich es lösen:

 string str = ((object)frame.Contents).ToString(); Debug.WriteLine(str); 

oder

 string str = frame.Contents.ToString() as string; Debug.WriteLine(str); 

Ich konvertiere jedoch explizit, was ich debuggen möchte, in eine Zeichenfolge

Das stimmt eigentlich nicht.

 var str = frame.Contents.ToString(); 

Diese Linie ist immer noch völlig dynamisch.

Sie müssen es explizit als string deklarieren.

Alternativ können Sie statisch früher arbeiten, indem Sie den frame explizit als TextFrame .

Niemand hat es so gesagt, das werde ich.

Veränderung

  var str = frame.Contents.ToString(); 

zu

  string str = frame.Contents.ToString();