33

私は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 が発生します。

追加情報: Conditional 属性があるため、メソッド 'WriteLine' を動的に呼び出すことはできません

問題は、条件付き属性を使用すると、実行時に動的に解決される型を処理する必要があるコードのバージョンがコンパイルされている可能性があることですが、デバッグしたいものを明示的に文字列に変換しているため、なぜこれがまだ起こっているのかわかりません。この問題を回避するにはどうすればよいですか?

4

3 に答える 3

52

あなたはvarここの使い方に噛まれていると思います。

だと思いContentsますdynamic

次の例を検討してください。

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

sありdynamicません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);
于 2012-12-31T18:22:19.230 に答える
8

しかし、デバッグしたいものを明示的に文字列に変換しています

それは実際には真実ではありません。

var str = frame.Contents.ToString();

この行はまだ完全に動的です。

として明示的に宣言する必要がありますstring

frameまたは、 asを明示的に宣言することで、以前に静的化することもできますTextFrame

于 2012-12-31T18:21:43.660 に答える
5

誰もこのように言ったことがないので、私はそうします。

変化する

 var str = frame.Contents.ToString();

 string str = frame.Contents.ToString();
于 2012-12-31T18:23:58.103 に答える