web-dev-qa-db-fra.com

C # Reflection: Comment obtenir une référence de classe à partir de string?

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

J'ai une chaîne avec un nom de classe -e.g: FooClass et je veux invoquer une méthode (statique) sur cette classe:

FooClass.MyMethod();

De toute évidence, je dois trouver une référence à la classe via la réflexion, mais comment?

80
rutger

Vous voudrez utiliser le Type.GetType mé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 manière qui est interne au même assemblage. Veuillez consulter réponse de Jon pour une explication plus détaillée de ce que vous devez savoir à ce sujet. Une fois que vous avez récupéré le type, mon exemple vous montre comment appeler la méthode.

117
Andrew Hare

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

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");
90
Jon Skeet

Une utilisation simple:

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

Échantillon:

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

Peu en retard pour la réponse, mais cela devrait faire l'affaire

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

votre nom qualifié d'assemblée devrait être comme ça

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

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

Vous aurez peut-être également besoin de nom de l’assemblage 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 nom.

3
GvS