#illustratorのオブジェクト
illustratorのオブジェクトにはGroupItemやPathItem等色々な種類があるが
その細かい種類に分類せずにとりあえずオブジェクト全般というものがあり、それが
PageItem と PageItems
例えばレイヤー内にGroupやPath、CompoundPath等色々入ってるけど
参照したいプロパティは、表示状態やロック状態等の
どのオブジェクトでも共通の場合にはPageItemを使用するほうが楽
※どの種類のオブジェクトか判断しないで良い為
ということで、良くPageItemを使うのですが
例えば、PageItemsを回して、個々のPageItemのプロパティにアクセスする場合
##javascriptだと以下のようになる
for(var i = 0; i < layer.pageItems.length; i++){
var pageItem = layer.pageItems[i];
$.writeln(pageItem.locked);
$.writeln(pageItem.visible);
}
##C#のだと…(↓コンパイルエラーになる)
しかし、C#の場合にはPageItemsはあるがPageItemが無い…
foreach (PageItem pageItem in pageItems)
{
Console.WriteLine(pageItem.Locked));
Console.WriteLine(pageItem.Visible));
}
じゃあvarにしたらいいんじゃないの?
varにすると型がobjectとなってしまう。
っていうかそもそもPageItem自体が無いって話だから型推論もクソも無い
###どうすりゃいいの?
###と思いましたがここで登場するはなんとあのダイナミックな奴
##C#これが正解
foreach (dynamic pageItem in pageItems)
{
Console.WriteLine(pageItem.Locked));
Console.WriteLine(pageItem.Visible));
}
###その名の通りdynamicを使います
dynamicの説明はここではしませんが、ざっくりいうと実行時まで型がわからないjavascript的なvarです
なんでわざわざPageItemを実装せずdynamicを使用する仕様にしたのかはわかりませんが
C#でPageItemを使うときはこの方法で出来るようです。
ただ実行時まで型がわからないので、IDEでプロパティの候補が出ないし大文字小文字などの誤字もコンパイルエラーで教えてくれないのでそこがちょっと微妙ですね。