C # -Reflexion: Wie erhalte ich eine Klassenreferenz aus einer Zeichenfolge?

88

Ich möchte dies in C # tun, weiß aber nicht wie:

Ich habe eine Zeichenfolge mit dem Klassennamen -eg: FooClassund möchte eine (statische) Methode für diese Klasse aufrufen:

FooClass.MyMethod();

Natürlich muss ich durch Reflexion einen Verweis auf die Klasse finden, aber wie?

Rutger
quelle

Antworten:

124

Sie möchten die Type.GetTypeMethode verwenden.

Hier ist ein sehr einfaches Beispiel:

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");
    }
}

Ich sage einfach, weil es sehr einfach ist, auf diese Weise einen Typ zu finden, der sich innerhalb derselben Baugruppe befindet. In Jons Antwort finden Sie eine ausführlichere Erklärung, was Sie darüber wissen müssen. Nachdem Sie den Typ abgerufen haben, zeigt Ihnen mein Beispiel, wie Sie die Methode aufrufen.

Andrew Hare
quelle
101

Sie können verwenden Type.GetType(string), müssen jedoch den vollständigen Klassennamen einschließlich des Namespace kennen. Wenn er nicht in der aktuellen Assembly oder mscorlib enthalten ist, benötigen Sie stattdessen den Assemblynamen. (Idealerweise Assembly.GetType(typeName)stattdessen verwenden - ich finde das einfacher, wenn es darum geht, die Baugruppenreferenz richtig zu machen!)

Zum Beispiel:

// "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");
Jon Skeet
quelle
1
+1 Gut gemacht - Ich habe eine Antwort hinzugefügt, die zeigt, wie der Typ verwendet wird, sobald Sie ihn abgerufen haben. Wenn Sie möchten, fügen Sie mein Beispiel in Ihre Antwort ein, und ich werde mein Beispiel löschen.
Andrew Hare
Da Ihre bereits akzeptiert wurde, schlage ich vor, dass wir es umgekehrt machen - Sie fügen meinen Inhalt zu Ihrer Antwort hinzu und ich werde diesen löschen :)
Jon Skeet
4
Um Ihre Antwort weiter zu erweitern: Wenn Sie nicht sicher sind, was Sie als Text an die GetType-Funktion übergeben sollen, und auf diese Klasse zugreifen können, sehen Sie sich typeof (class) .AssemblyQualifiedName an. Dies gibt Ihnen eine klare Vorstellung.
TechExplorer
10

Eine einfache Verwendung:

Type typeYouWant = Type.GetType("NamespaceOfType.TypeName, AssemblyName");

Stichprobe:

Type dogClass = Type.GetType("Animals.Dog, Animals");
André Voltolini
quelle
7

Etwas spät zur Antwort, aber das sollte reichen

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

Ihr qualifizierter Name für die Baugruppe sollte so lauten

"Boom.Bam.Class, Boom.Bam, Version=1.0.0.262, Culture=neutral, PublicKeyToken=e16dba1a3c4385bd"
Atul Chaudhary
quelle
4
Vielen Dank, dass Sie explizit klargestellt haben, wie der qualifizierte Name der Baugruppe aussehen soll.
Drew
3

Über Type.GetType können Sie die Typinformationen abrufen . Mit dieser Klasse können Sie die Methodeninformationen abrufen und dann die Methode aufrufen (für statische Methoden lassen Sie den ersten Parameter null).

Möglicherweise benötigen Sie auch den Namen der Baugruppe , um den Typ korrekt zu identifizieren.

Befindet sich der Typ in der aktuell ausgeführten Assembly oder in Mscorlib.dll, reicht es aus, den durch seinen Namespace qualifizierten Typnamen anzugeben.

GvS
quelle
0

Wir können benutzen

Type.GetType ()

um Klassennamen zu erhalten und kann auch ein Objekt davon mit erstellen 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; }
    }
}
Amol Bhor
quelle