毎回わからなくなるのでメモ。
/* 基底型.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 に対して例外が発生することがない