LoginSignup
0
0

More than 5 years have passed since last update.

ある型を別の型へ代入する事が可能か調べる方法(IsAssignableFromの使い方)

Last updated at Posted at 2016-09-11

System.Type.IsAssignableFromメソッドが便利なのですが、よく使い方を忘れるのでメモ

構文

VB.NET
Public Overridable Function IsAssignableFrom(c As System.Type) As Boolean

すなわち、型インスタンスCを型インスタンスTに割り当てる事が可能か1どうか調べたいときには次のように書きます2。(私はよくどっちがどっちだったか混乱して「CとTを逆に書く」ミスをよくやってしまいます。)

VB.NET
If T.IsAssignableFrom(C) ...

使用例

実際の使い方を説明します。想定する状況は以下の通り。

  • MaskedTextBox型の変数hogeMaskedTextBoxがある
  • hogeMaskedTextBoxがTextBox型変数に代入できるか調べたい

hogeMaskedTextBoxがTextBoxかどうか調べるんだから・・・こうかな!?

コード1 (間違ってる例)

VB.NET
TextBox.IsAssignableFrom(hogeMaskedTextBox)

イミディエイトウィンドウで試しに実行すると・・・ダメです。怒られました。
IsAssignableFrom160911_01.png

そりゃそうですね。IsAssignableFromはSystem.Typeクラスのメソッドであり、TextBoxクラスのメンバじゃないのでエラーになって当然です。・・・じゃあこうでしょ!GetType 演算子 を使ってTypeオブジェクトに変換!

コード2 (まだ間違ってる例)

VB.NET
GetType(TextBox).IsAssignableFrom(hogeMaskedTextBox)

もう一回試すと・・・またエラーです!
IsAssignableFrom160911_02.png

あ、そっか!ISAssignableFromの引数は型だから、ここは「hogeMaskedTextBoxという オブジェクト 」ではなく「hogeMaskedTextBoxオブジェクトの 」を渡してやる必要があります。その方法は?今度はGetType メソッド でType型オブジェクトを取得してやらないといけないのです。3

コード3 (正しい例)

VB.NET
GetType(TextBox).IsAssignableFrom(hogeMaskedTextBox.GetType)

実行すると・・・今度はエラーになりません!よかった!
IsAssignableFrom160911_03.PNG

返ってきている値がFalseなので、MaskedTextBoxとTextBoxは継承関係にない事が分かりました。4

結論

IsAssignableFromを呼び出す型と、引数に入れる型を逆にしないように気をつける事と、GetType演算子、GetTypeメソッドの使い方に注意して使おう。


  1. 「割り当てる事が可能かどうか」なんてふんわりした表現で逃げちゃいましたが、IsAssignableFromがTrueになる厳密な条件を知っておきたい人はMSDNを参照してください。(丸投げ)https://msdn.microsoft.com/ja-jp/library/system.type.isassignablefrom(v=vs.110).aspx 

  2. 実際に代入してみてエラー発生するか試してもいいんですが、イミディエイトウィンドウに1行コード打ち込んで確認できた方が「あの型ってあの型に代入できたっけ・・・」って調べたいときにすぐ結果が分かって便利じゃないですか! 

  3. ややこしいですが、コード例2におけるGetType(TextBox)は 型名を引数にとる演算子 です。それに対し、コード例3におけるhogeMaskedTextBox.GetTypeはObjectクラスに定義された メソッド です。違うものが同じ名前で呼ばれるもんだから混乱してしまう・・・ 

  4. ちなみに、MaskedTextBoxとTextBoxは継承関係にはありませんが、共通の継承元を持っています。TextBoxBaseです。だから、下記の通りに実行するとTrueが結果として返ってきます。IsAssignableFrom160911_04.PNG 

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0