LoginSignup
2

More than 5 years have passed since last update.

ネームスペースのない型名(String)からTypeを取得

Last updated at Posted at 2017-02-21

初めに

PlantUMLのクラス図からスケルトンコード生成
で「クラス図に使用されている型名からusingを宣言する」機能を作った時に使用した方法です。

型名からType取得までの流れ

アセンブリ取得

読み込まれているアセンブリを取得します。

AppDomain.CurrentDomain.GetAssemblies ()

Type取得

アセンブリ内の全Typeを取得します。

Assembly assembly;
Type[] types = assembly.GetTypes()

ジェネリック対応

ジェネリックの場合は「`1」で表されるようです。
そのため型名を変換します。
例)List<string> → List`1

string type_name; // Typeを取得したい型名
int index = type_name.IndexOf ("<");
if (index >= 0) {
type_name = type_name.Remove (index) + "`1";
}

型名とTypeを比較

ネームスペースのない型名をTypeから取得し比較します。

Type type; // アセンブリから取得したType
string type_name; // Typeを取得したい型名
type.Name.Equals (type_name) // trueならtypeが型名の型

型名からTypeを取得する関数

Sample.cs
public static Type GetTypeFromTypeName(string type_name)
{
    // ジェネリック対応処理
    int index = type_name.IndexOf ("<");
    if (index >= 0) {
        type_name = type_name.Remove (index) + "`1";
    }

    // タイプ検索
    foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies ()) {
        foreach (var type in assembly.GetTypes ()) {
            if (type.Name.Equals (type_name)) {
                return type;
            }
        }
    }

    return null;
}

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
2