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?

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.


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

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

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"

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.


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; }
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.