2010/11/18

[C#]クラスのインターフェースを調べる

このエントリーをはてなブックマークに追加
任意のクラスがどういうインターフェースを持っているのかを調べる方法です。
プログラミングに使用するほとんどの時間は、自分のクラスを制作するのと、使用するクラスを調べることに費やされるもの、と某書籍に書いていました。普段何気なく使用しているクラスに、本来どういう役割や機能が実装されているのかを知る手がかりになれば幸いです。

インターネット(msdn)で調べる


.netのクラスを単に調査したいときは一番手っ取り早い。クラス名でググれば、ほとんど出てきます。
しかし手っ取り早くはあるもののドキュメント一式をさらうまでもなく、そのときの要件に沿っているかどうかが知りたいだけのときがほとんどなので、ケースバイケースだったりします。もちろん、ちゃんと読んだほうがいいのですが。

String クラス (System)
http://msdn.microsoft.com/ja-jp/library/system.string(v=VS.85).aspx

isを使う(またはasを使う)

is/asを使うことでキャストが可能かどうか調べることができます。
Type type = typeof(string); // 仮に謎のクラスをTypeとします

// isを使う
if (type is ICloneable) {
    // typeにはIClonableが実装されている
}

//asを使う
ICloneable cloneable = type as ICloneable;
if (cloneable != null) {
    // typeにはIClonableが実装されている
}

is (C#)
http://msdn.microsoft.com/ja-jp/library/scekt9xw(VS.80).aspx

as (C# リファレンス)
http://msdn.microsoft.com/ja-jp/library/cscsdfbt(v=VS.80).aspx

インターフェースを自力でリストアップする

実装されているインターフェースをリストアップする関数を書きました。
基底クラスがある場合は、基底クラスにも潜って再帰的に調べます。
public IEnumerable<Type> GetInterfaces(Type type) {
    foreach(Type t in type.GetInterfaces()){
        yield return t;
    }

    if (type.BaseType != null) {
        foreach (Type t in GetInterfaces(type.BaseType)) {
            yield return t;
        }
    }
}

実行サンプル
stringクラスのインターフェースを列挙します。
foreach (Type t in GetInterfaces(typeof(string))) {
    Console.WriteLine(t.ToString());
}

結果。
System.IComparable
System.ICloneable
System.IConvertible
System.IComparable`1[System.String]
System.Collections.Generic.IEnumerable`1[System.Char]
System.Collections.IEnumerable
System.IEquatable`1[System.String]


`1[System.String]は、<System.String>のこと。つまりジェネリッククラスです。

0 件のコメント :

コメントを投稿