カスタム Web コントロールの名前空間のトップレベルは、コントロール名と同じにしてはならない
たとえば、LabelEx というプロジェクトを作成し、LabelEx というカスタムコントロールを作成したとする
これを aspx にて使用すると、aspx から作成される cs ファイルには当然 using LabelEx; が出力される
また、aspx から cs ファイルが作成されるとき、ページ内のコントロールは全て完全に名前空間で就職された形で出力される
つまりこの場合だと、LabelEx.LabelEx label; のような形で出力される
完全に名前空間で修飾されているため、一見問題ないように見える
しかし、これがコンパイルエラーとなる
using LabelEx; があるために、LabelEx.LabelEx の始めの LabelEx があいまいになる
そして、コンパイラは LabelEx 名前空間に LabelEx クラスがあるがために、これを LabelEx.LabelEx.LabelEx とみなしてコンパイルしようとする
そのため、型が見つからないというコンパイルエラーとなってしまう
完全修飾されているからそっちを優先してくれたらいいのに・・・・・
この例は、名前空間と同じ名前のクラスだった場合だが、事はそう簡単ではない
要するに using にてインポートされうる全てのクラス名は、カスタムコントロールの名前空間のトップレベルにはできないのだ
たとえば、Control.LabelEx というカスタムコントロールを作成し、画面に登録した場合コンパイルできなくなる
で、これらはバージョンによって少し挙動が違う
v1.x の場合は、どのように利用しようとも実行時にエラーになる
v2.0 の場合は、そのまま画面に登録すると使用できる
これは、単純にフィールドとして登録される場合、global::LabelEx.LabelEx と global がつき完全修飾が保障されるからのようだ
しかし、これが Repeater のようなデータバインドのテンプレート内で使用されていると、相変わらずLabelEx.LabelEx のように出力されるのでコンパイルエラーとなる
と、まあ年始にわんくまの掲示板で質問されていた内容が解決できた
ここ数日どたばたしていて、まったくみていなかったので「あの記事はどうなったんだろう?」と思い、見に行くとわんくま掲示板が消されていた
生扉・・・・・・ヤッテクレル
閑話休題
というわけで、カスタム Web コントロールを開発する場合、名前空間の最初の単語には十分に気をつけていただきたい
ところで、株式会社 Label さんとかは Microsoft が推奨する名前空間の名づけ方法ができなくなるわけか・・・・
Label はまだしも、株式会社 Unit とか、株式会社 Triplet とかはありそうだ