Réflexion C #: Comment obtenir une référence de classe à partir d'une chaîne?

90

Je veux faire cela en C #, mais je ne sais pas comment:

J'ai une chaîne avec un nom de classe -eg: FooClasset je veux invoquer une méthode (statique) sur cette classe:

FooClass.MyMethod();

Évidemment, j'ai besoin de trouver une référence à la classe par réflexion, mais comment?

rutger
la source

Réponses:

125

Vous voudrez utiliser la Type.GetTypeméthode.

Voici un exemple très simple:

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

Je dis simple car il est très facile de trouver un type de cette façon qui soit interne au même assemblage. Veuillez consulter la réponse de Jon pour une explication plus approfondie de ce que vous devrez savoir à ce sujet. Une fois que vous avez récupéré le type, mon exemple vous montre comment invoquer la méthode.

Andrew Hare
la source
101

Vous pouvez utiliser Type.GetType(string), mais vous aurez besoin de connaître le nom complet de la classe, y compris l'espace de noms, et si ce n'est pas dans l'assembly actuel ou mscorlib, vous aurez besoin du nom de l'assembly à la place. (Idéalement, utilisez Assembly.GetType(typeName)plutôt - je trouve cela plus facile en termes de bonne référence d'assemblage!)

Par exemple:

// "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
la source
1
+1 Bien joué - J'ai ajouté une réponse qui montre comment utiliser le type une fois que vous l'avez récupéré. Si vous le souhaitez, allez-y et fusionnez mon exemple dans votre réponse et je supprimerai le mien.
Andrew Hare
Étant donné que le vôtre a déjà été accepté, je suggère que nous le fassions dans l'autre sens - vous ajoutez mon contenu à votre réponse, et je supprimerai celle-ci :)
Jon Skeet
4
Juste pour étendre votre réponse, si vous ne savez pas quoi passer en tant que texte à la fonction GetType et que vous pouvez accéder à cette classe, regardez typeof (class) .AssemblyQualifiedName, cela vous donnera une idée claire.
techExplorer
10

Une utilisation simple:

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

Échantillon:

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

Un peu tard pour la réponse mais cela devrait faire l'affaire

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

le nom qualifié de votre assembly devrait ressembler à ceci

"Boom.Bam.Class, Boom.Bam, Version=1.0.0.262, Culture=neutral, PublicKeyToken=e16dba1a3c4385bd"
Atul Chaudhary
la source
4
Merci d'avoir explicitement précisé à quoi devrait ressembler le nom qualifié d'assembly.
Tiré
3

Via Type.GetType vous pouvez obtenir les informations de type. Vous pouvez utiliser cette classe pour obtenir les informations sur la méthode , puis appeler la méthode (pour les méthodes statiques, laissez le premier paramètre nul).

Vous pouvez également avoir besoin du nom de l'assembly pour identifier correctement le type.

Si le type se trouve dans l'assembly en cours d'exécution ou dans Mscorlib.dll, il suffit de fournir le nom du type qualifié par son espace de noms.

GvS
la source
0

On peut utiliser

Type.GetType ()

pour obtenir le nom de la classe et peut également en créer un objet en utilisant 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
la source