初めに
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;
}