LoginSignup
11
6

More than 5 years have passed since last update.

Type.IsAssignableFrom はどっちがどっち?

Last updated at Posted at 2014-05-28

毎回わからなくなるのでメモ。

/* 基底型.IsAssignableFrom(派生型) -> true */
// false
var textBoxIsAssignableFromControl = typeof(TextBox).IsAssignableFrom(typeof(Control));
// true
var controlIsAssignableFromTextBox = typeof(Control).IsAssignableFrom(typeof(TextBox));

/* あるオブジェクトがあるクラスを継承しているかを知りたい場合 */
var someObj = new TextBox();
var someType = someObj.GetType();

// is 演算子はわかりやすい
// true
var someObjIsControl = someObj is Control;

// Type オブジェクトで同じような判定をする場合、順序が逆と覚えておこう
// true
var someTypeIsControl = typeof(Control).IsAssignableFrom(someType);

最近は「null 安全な順序」と覚えています。
実は引数に null を渡しても ArgumentNullException が発生しないのですよね。

foo.IsAssignableFrom(typeof(FooBar));
// という順序だと変数が null のときどうやっても NullReferenceException が発生してしまう

typeof(FooBar).IsAssignableFrom(foo);
// foo に null が入っていても false が返る作りになっているので null に対して例外が発生することがない
11
6
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
11
6