C#リフレクション:文字列からクラス参照を取得する方法?


89

これをC#で実行したいのですが、方法がわかりません。

クラス名が-eg:の文字列があり、FooClassこのクラスで(静的)メソッドを呼び出したい:

FooClass.MyMethod();

明らかに、リフレクションを介してクラスへの参照を見つける必要がありますが、どうやって?

回答:


124

Type.GetTypeメソッドを使用する必要があります。

これは非常に簡単な例です:

using System;
using System.Reflection;

class Program
{
    static void Main()
    {
        Type t = Type.GetType("Foo");
        MethodInfo method 
             = t.GetMethod("Bar", BindingFlags.Static | BindingFlags.Public);

        method.Invoke(null, null);
    }
}

class Foo
{
    public static void Bar()
    {
        Console.WriteLine("Bar");
    }
}

この方法で同じアセンブリの内部にあるタイプを見つけるのは非常に簡単ので、私は単純だと言います。あなたがそれについて何を知る必要があるかについてのより完全な説明についてはジョンの答えを見てください。タイプを取得したら、私の例ではメソッドを呼び出す方法を示します。


101

を使用できますがType.GetType(string)、名前空間を含む完全なクラス名を知っている必要があります。現在のアセンブリまたはmscorlibにない場合は、代わりにアセンブリ名が必要です。(理想的には、Assembly.GetType(typeName)代わりに使用します-アセンブリ参照を正しくするという点で、より簡単です!)

例えば:

// "I know String is in the same assembly as Int32..."
Type stringType = typeof(int).Assembly.GetType("System.String");

// "It's in the current assembly"
Type myType = Type.GetType("MyNamespace.MyType");

// "It's in System.Windows.Forms.dll..."
Type formType = Type.GetType ("System.Windows.Forms.Form, " + 
    "System.Windows.Forms, Version=2.0.0.0, Culture=neutral, " + 
    "PublicKeyToken=b77a5c561934e089");

1
+1よくできました- 取得したタイプの使用方法を示す回答を追加しました。よろしければ、先に進んで私の例をあなたの答えにマージしてください。そうすれば私が削除します。
Andrew Hare、

あなたのコンテンツが既に受け入れられていることを考えると、逆の方法で行うことをお勧めします。私のコンテンツをあなたの回答に追加し、これを削除します:)
Jon Skeet

4
回答をさらに広げるために、GetType関数に何をテキストとして渡すかわからない場合にこのクラスにアクセスして、typeof(class).AssemblyQualifiedNameを確認すると、明確なアイデアが得られます。
techExplorer 2012年


7

返信に少し遅れますが、これでうまくいくはずです

Type myType = Type.GetType("AssemblyQualifiedName");

アセンブリ修飾名は次のようになります

"Boom.Bam.Class, Boom.Bam, Version=1.0.0.262, Culture=neutral, PublicKeyToken=e16dba1a3c4385bd"

4
アセンブリ修飾名がどのようになるかを明確にしていただきありがとうございます。
ドリュー

3

経由Type.GetTypeあなたは型情報を取得することができます。このクラスを使用してメソッド情報を取得し、メソッド呼び出すことができます(静的メソッドの場合、最初のパラメーターをnullのままにします)。

タイプを正しく識別するために、アセンブリ名も必要になる場合があります。

タイプが現在実行中のアセンブリまたはMscorlib.dllにある場合は、その名前空間で修飾されたタイプ名を指定するだけで十分です。


0

使用できます

Type.GetType()

クラス名を取得し、それを使用してそのオブジェクトを作成することもできます Activator.CreateInstance(type);

using System;
using System.Reflection;

namespace MyApplication
{
    class Application
    {
        static void Main()
        {
            Type type = Type.GetType("MyApplication.Action");
            if (type == null)
            {
                throw new Exception("Type not found.");
            }
            var instance = Activator.CreateInstance(type);
            //or
            var newClass = System.Reflection.Assembly.GetAssembly(type).CreateInstance("MyApplication.Action");
        }
    }

    public class Action
    {
        public string key { get; set; }
        public string Value { get; set; }
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.