WebBrowserコントロールとTextプロパティ(その2)

やまきさんに言及頂いた。

Yuya Yamaki’s blog

最初は私も何か変わったことをしているのではないか、と思ったのだが、恐らくはSystem.Windows.Forms.WebBrowserBase#Textプロパティが以下のように実装されているだけではないだろうか。

[EditorBrowsableAttribute(EditorBrowsableState.Never)]
public override string Text {
  get { return ""; }
  set { throw new NotSupportedException(); }
}
(""が戻るのと、NotSupportedExceptionがスローされるのは確認済み。しかし、.NET Frameworkのアセンブリを解析するのはライセンス違反なので、以上はあくまでも想像のコード)

.NET Frameworkが出来、WindowsFormsが整備されて、System.Windows.Forms.Controlクラスという全てのコントロールのスーパクラスが提供されたことにより、例えばTextプロパティ等はコントロールの種別を意識しないでアクセスできるプロパティだと思っていたのだが、残念ながらそうではなく、例え文字列プロパティのアクセスであっても扱いに注意しなくてはならないようだ。

WebBrowserコントロールとTextプロパティ

フォームに貼り付けたコントロールのTextプロパティをチェックして、書き換え可能であれば書き換えてしまうコードがあったとして、たまたま、対象がSystem.Windows.Forms.WebBrowserコントロールだったとしよう。

PropertyInfo info = form1.ActiveControl.GetType().GetProperty("Text");
if (info != null && info.CanWrite) {
    form1.ActiveControl.Text = "";
}

実行するとifブロックには入るのだが、Textプロパティを書き換える際にアクセサで例外が発生する。

Exception: System.NotSupportedException
Message: WebBrowser コントロールは Text プロパティをサポートしていません。
Source: System.Windows.Forms
   場所 System.Windows.Forms.WebBrowserBase.set_Text(String value)

CanWriteプロパティの説明は

PropertyInfo.CanWrite プロパティ

                                                            • -

bool CanWrite { get; }
このプロパティに書き込むことができる場合は true。それ以外の場合は false。

とある。
書き込めるんだけどサポートしていないってのはアリなのか? そうではなく、上位ActiveXラッパーの仕様がそうなっている(サポートされていない)からなのか? よくわからん。

リフレクション情報をあてにしちゃいけないってことだけは確かなようだ。

追記:
System.Windows.Forms.ControlクラスのTextプロパティをオーバライドしているが、書き込み時に例外をスローしているだけのようだ。
結論としては、全てのコントロールにおいてTextプロパティが使えるという前提でプログラミングをしてはいけない。例えTextプロパティというありふれたプロパティであっても、例外トラップは必要だということ。