System.Type.IsAssignableFromメソッドが便利なのですが、よく使い方を忘れるのでメモ
構文
Public Overridable Function IsAssignableFrom(c As System.Type) As Boolean
すなわち、型インスタンスCを型インスタンスTに割り当てる事が可能か1どうか調べたいときには次のように書きます2。(私はよくどっちがどっちだったか混乱して「CとTを逆に書く」ミスをよくやってしまいます。)
If T.IsAssignableFrom(C) ...
使用例
実際の使い方を説明します。想定する状況は以下の通り。
- MaskedTextBox型の変数hogeMaskedTextBoxがある
- hogeMaskedTextBoxがTextBox型変数に代入できるか調べたい
hogeMaskedTextBoxがTextBoxかどうか調べるんだから・・・こうかな!?
コード1 (間違ってる例)
TextBox.IsAssignableFrom(hogeMaskedTextBox)
イミディエイトウィンドウで試しに実行すると・・・ダメです。怒られました。
そりゃそうですね。IsAssignableFromはSystem.Typeクラスのメソッドであり、TextBoxクラスのメンバじゃないのでエラーになって当然です。・・・じゃあこうでしょ!GetType 演算子 を使ってTypeオブジェクトに変換!
コード2 (まだ間違ってる例)
GetType(TextBox).IsAssignableFrom(hogeMaskedTextBox)
あ、そっか!ISAssignableFromの引数は型だから、ここは「hogeMaskedTextBoxという オブジェクト 」ではなく「hogeMaskedTextBoxオブジェクトの 型 」を渡してやる必要があります。その方法は?今度はGetType メソッド でType型オブジェクトを取得してやらないといけないのです。3
コード3 (正しい例)
GetType(TextBox).IsAssignableFrom(hogeMaskedTextBox.GetType)
返ってきている値がFalseなので、MaskedTextBoxとTextBoxは継承関係にない事が分かりました。4
結論
IsAssignableFromを呼び出す型と、引数に入れる型を逆にしないように気をつける事と、GetType演算子、GetTypeメソッドの使い方に注意して使おう。
-
「割り当てる事が可能かどうか」なんてふんわりした表現で逃げちゃいましたが、IsAssignableFromがTrueになる厳密な条件を知っておきたい人はMSDNを参照してください。(丸投げ)https://msdn.microsoft.com/ja-jp/library/system.type.isassignablefrom(v=vs.110).aspx ↩
-
実際に代入してみてエラー発生するか試してもいいんですが、イミディエイトウィンドウに1行コード打ち込んで確認できた方が「あの型ってあの型に代入できたっけ・・・」って調べたいときにすぐ結果が分かって便利じゃないですか! ↩
-
ややこしいですが、コード例2におけるGetType(TextBox)は 型名を引数にとる演算子 です。それに対し、コード例3におけるhogeMaskedTextBox.GetTypeはObjectクラスに定義された メソッド です。違うものが同じ名前で呼ばれるもんだから混乱してしまう・・・ ↩
-
ちなみに、MaskedTextBoxとTextBoxは継承関係にはありませんが、共通の継承元を持っています。TextBoxBaseです。だから、下記の通りに実行するとTrueが結果として返ってきます。 ↩