.NET Core - Type.IsAssignableFromのメモ

Type.IsAssignableFromは「メソッドを呼び出すインスタンス型の変数」に「メソッドの引数で指定した型のインスタンス」を割り当てることができるかどうかを判断します。

このメソッドはあるインターフェイスを実装しているか?あるクラスを派生しているか?をリフレクションで調べるときに使うと思いますが、文章で説明されてもすんなり頭に入ってこないですね。

たまに使うとどっちがどっちか忘れてるというか考えることが多いのでサンプルを残しておきます。

class Base {
}

interface IInterface {
}

class Derived : Base, IInterface {
}

var baseType = typeof(Base);
var derivedType = typeof(Derived);
var interfaceType = typeof(IInterface);

// Base型の変数にDerived型のインスタンスを割り当てることができる
Assert.True(baseType.IsAssignableFrom(derivedType));

// Derived型の変数にBase型のインスタンスを割り当てることができない
Assert.False(derivedType.IsAssignableFrom(baseType));

// Base型の変数にBase型のインスタンスを割り当てることができる
Assert.True(baseType.IsAssignableFrom(baseType));

// IInterface型の変数にDerived型のインスタンスを割り当てることができる
Assert.True(interfaceType.IsAssignableFrom(derivedType));

ちなみにあるクラスを派生してるかの判断だけでよければ(インターフェイスの実装は判断しなくてよければ)Type.IsSubclassOfでもよさげです。

// DerivedはBaseのサブクラスである
Assert.True(derivedType.IsSubclassOf(baseType));

// BaseはDerivedのサブクラスではない
Assert.False(baseType.IsSubclassOf(derivedType));

// Derived(インターフェイスの実装)はIInterfaceのサブクラスではない
Assert.False(derivedType.IsSubclassOf(interfaceType));

参考