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プロパティというありふれたプロパティであっても、例外トラップは必要だということ。