Type クラスだけを使って is-a 関係を調べる方法

今回も小ネタを。最近ネタが尽き気味です><

2 つのクラスが is-a 関係かどうかを調べたい。でも、Type オブジェクトしか与えられていない…。こんなとき、どうしよう?BaseType プロパティを再帰的にチェックするしかないのか?!

大丈夫。

            ヾヽ'::::::::::::::::::::::::::'',    / 時 .あ ま ヽ
             ヾゝ:::::::::::::::::::::::::::::{     |  間 .わ だ  |
             ヽ::r----―‐;:::::|    | じ て    |
             ィ:f_、 、_,..,ヽrリ    .|  ゃ る     |
              L|` "'  ' " ´bノ     |  な よ     |
              ',  、,..   ,イ    ヽ い う    /
             _ト, ‐;:-  / トr-、_   \  な   /
       ,  __. ィイ´ |:|: ヽ-- '.: 〃   `i,r-- 、_  ̄ ̄
      〃/ '" !:!  |:| :、 . .: 〃  i // `   ヽヾ
     / /     |:|  ヾ,、`  ´// ヽ !:!     '、`
      !      |:| // ヾ==' '  i  i' |:|        ',
     |   ...://   l      / __ ,   |:|::..       |
  とニとヾ_-‐'  ∨ i l  '     l |< 天  ヾ,-、_: : : .ヽ
 と二ヽ`  ヽ、_::{:! l l         ! |' 夂__ -'_,ド ヽ、_}-、_:ヽ

Type クラスの IsAssignableFrom メソッドを使えば一発です。

using System;
namespace TypeSample
{
    public class Foo { }
    public class Bar : Foo { }
    public class Hoge : Bar { }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hoge クラスは Foo クラスを継承しているか?");
            Console.WriteLine(typeof(Foo).IsAssignableFrom(typeof(Hoge))); // => True

            Console.WriteLine("Bar クラスは Program クラスを継承しているか?");
            Console.WriteLine(typeof(Program).IsAssignableFrom(typeof(Bar))); // => False

            Console.ReadLine();
        }
    }
}

EnterpriseLibrary のソースコードを読んで、このメソッドの存在を知りました。便利なメソッドがあるもんだ。