HIRASE CONNECTION WK

programming collection

目次

Blog 利用状況

ニュース

書庫

日記カテゴリ

Link Collection

[C#] 型名(String)から型(Type)を取得して、インスタンスを作る。

C# で型名を System.String で与えられたときに、その型名から System.Type を取得します。

追記:Type.GetType(String)を使っても同様の結果が得られます。このエントリは、実験的に、自分でも実装できるかをやってみたものです。

using System;
using System.Collections.Generic;

namespace Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 型名から型を取得。
            Type type = GetTypeFromName("System.DateTime");

            // Typeからインスタンス作成。
            Object instance = Activator.CreateInstance(type); 
        }

        /// <summary>
        /// 特定の名前を持つ型を取得します。
        /// </summary>
        /// <param name="name">型名</param>
        /// <returns>取得した型</returns>
        public static Type GetTypeFromName(String name)
        {
            return GetTypeFromName(name, GetCurrentDomainAssembliesType());
        }

        /// <summary>
        /// 特定の名前を持つ型を取得します。
        /// </summary>
        /// <param name="name">型名</param>
        /// <param name="types">型のリスト</param>
        /// <returns>取得した型</returns>
        public static Type GetTypeFromName(String name, IEnumerable<Type> types)
        {
            foreach (Type type in types)
            {
                if (String.Equals(type.FullName, name) || String.Equals(type.AssemblyQualifiedName, name))
                    return type;
            }
            return null;
        }

        /// <summary>
        /// CurrentDomainのアセンブリの型一覧を取得します。
        /// </summary>
        /// <returns>型一覧</returns>
        public static IList<Type> GetCurrentDomainAssembliesType()
        {
            System.Reflection.Assembly[] assemblies;
            assemblies = System.AppDomain.CurrentDomain.GetAssemblies();
            List<Type> assemblyTypes = new List<Type>();
            foreach (System.Reflection.Assembly assembly in assemblies)
            {
                assemblyTypes.AddRange(assembly.GetTypes());
            }
            return assemblyTypes;
        }
    }
}

投稿日時 : 2008年3月26日 1:33

コメントを追加

# re: [C#] 型名(String)から型(Type)を取得して、インスタンスを作る。 2008/03/26 8:54 myugaru

おぉ、ほんとだ。すんごいですね。φ(。_。*)メモメモ
何か楽しい遊び方を考えなければっ(*^▽^)ノ

ずっと前に文字列をenum値にするのを使ってました。
なんか似た感じのコードになった記憶があるけど・・・忘れました(苦笑
iniファイルに
Place=Tokyo
とか一行書いてあるやつをC#の方では
enum {
Tokyo, Osaka, Nagoya
}
ってやつでTokyoなら0にして読みたいとかでした。

# re: [C#] 型名(String)から型(Type)を取得して、インスタンスを作る。 2008/03/26 9:24 なちゃ

うーん結構特殊なコーディングに見える…

# re: [C#] 型名(String)から型(Type)を取得して、インスタンスを作る。 2008/03/26 10:52 いしだ

Type type = Type.GetType("System.DateTime");
これとは動作が違うのでしょうか?
どういう場合に、このパターンで取得しなければならないかが、読めないでいます。。。

# re: [C#] 型名(String)から型(Type)を取得して、インスタンスを作る。 2008/03/26 11:10 T.Hirase

TO: myugaruさま。
いしださまが書かれておられますように、
実は、Type.GetType(String) を使ってもできるんです。

TO: なちゃさま。
特殊なコーディングというのは正解です。
「実験的に、自分でも実装できるかをやってみた」
ということを書き忘れてました。。
追記しておきます。

TO: いしださま。
そんなわけで、「動作が同じか」といわれると自信なしです。
Type.GetType(String)の実装を追ってみても、
最終的に extern されたメソッドに飛ぶので、わからないです。
すみません・・。


# 意味ねぇな、このエントリ。

# re: [C#] 型名(String)から型(Type)を取得して、インスタンスを作る。 2008/03/26 11:26 いしだ

> 「実験的に、自分でも実装できるかをやってみた」
なるほど、勉強になります。
hownにメモメモ。。。

# re: [C#] 型名(String)から型(Type)を取得して、インスタンスを作る。 2008/03/26 11:29 いしだ

しまった、スペルミス。。。
howmでした。

アセンブリの型一覧を取得する方法等、勉強になりました。

# re: [C#] 型名(String)から型(Type)を取得して、インスタンスを作る。 2008/03/26 11:45 T.Hirase

howm・・勉強になります。
そんなEmacsツール(アドイン?)があったなんて。
# Visual Studioアドインになんないかな。

# re: [C#] 型名(String)から型(Type)を取得して、インスタンスを作る。 2008/03/26 12:36 よねけん

こういう実験的な遊びは好きですね。
ところでこの処理の場合、yieldを使うと処理速度が有利になります。
非yield版では、全アセンブリの全型をリストにしてから処理が返りますが、
yield版なら1アセンブリの1型ごとに処理を戻すので、高速化されます。

GetCurrentDomainAssembliesTypeメソッドをyield版に書き換えてみました。

/// <summary>
/// CurrentDomainのアセンブリの型一覧を取得します。
/// </summary>
/// <returns>型一覧</returns>
public static IEnumerable<Type> GetCurrentDomainAssembliesType()
{
System.Reflection.Assembly[] assemblies;
assemblies = System.AppDomain.CurrentDomain.GetAssemblies();
foreach (System.Reflection.Assembly assembly in assemblies)
{
foreach(System.Type type in assembly.GetTypes())
{
yield return type;
}
}
}

# re: [C#] 型名(String)から型(Type)を取得して、インスタンスを作る。 2008/03/26 21:53 T.Hirase

TO: よねけんさま。
「おぉ・・」です。

まだ、yieldについて理解が浅かったようです。
このyield版メソッドの戻り値を何度も使いまわして大丈夫なのかな・・・
と思ったのですが、全然問題ないですし、確かにリストを作らない分速そうです。


メモメモ・・・です。

タイトル
名前
URL
コメント