Riflessione C #: come ottenere il riferimento alla classe dalla stringa?


92

Voglio farlo in C #, ma non so come:

Ho una stringa con un nome di classe -eg: FooClasse voglio invocare un metodo (statico) su questa classe:

FooClass.MyMethod();

Ovviamente devo trovare un riferimento alla classe tramite riflessione, ma come?

Risposte:


127

Ti consigliamo di utilizzare il Type.GetTypemetodo.

Ecco un esempio molto semplice:

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

Dico semplice perché è molto facile trovare un tipo in questo modo interno allo stesso assieme. Si prega di consultare la risposta di Jon per una spiegazione più approfondita di ciò che è necessario sapere al riguardo. Dopo aver recuperato il tipo, il mio esempio mostra come invocare il metodo.


103

Puoi usare Type.GetType(string), ma dovrai conoscere il nome completo della classe incluso lo spazio dei nomi e, se non è nell'assembly corrente o in mscorlib, avrai invece bisogno del nome dell'assembly. (Idealmente, usa Assembly.GetType(typeName)invece - lo trovo più facile in termini di ottenere il riferimento all'assembly giusto!)

Per esempio:

// "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 Ben fatto: ho aggiunto una risposta che mostra come utilizzare il tipo dopo averlo recuperato. Se vuoi, vai avanti e unisci il mio esempio alla tua risposta e io cancellerò il mio.
Andrew Hare

Dato che il tuo è già stato accettato, ti suggerisco di farlo al contrario: aggiungi il mio contenuto alla tua risposta e io cancellerò questo :)
Jon Skeet

4
Solo per estendere ulteriormente la tua risposta, se non sei sicuro di cosa passare come testo alla funzione GetType e puoi accedere a questa classe, guarda typeof (class) .AssemblyQualifiedName, questo darà un'idea chiara.
techExplorer

10

Un semplice utilizzo:

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

Campione:

Type dogClass = Type.GetType("Animals.Dog, Animals");

7

Un po 'in ritardo per la risposta, ma questo dovrebbe funzionare

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

il nome qualificato dell'assembly dovrebbe essere così

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

4
Grazie per aver chiarito in modo esplicito come dovrebbe apparire il nome qualificato dell'assembly.
Drew il

3

Tramite Type.GetType puoi ottenere le informazioni sul tipo. È possibile utilizzare questa classe per ottenere le informazioni sul metodo e quindi richiamare il metodo (per i metodi statici, lasciare il primo parametro null).

Potrebbe anche essere necessario il nome dell'assembly per identificare correttamente il tipo.

Se il tipo si trova nell'assembly attualmente in esecuzione o in Mscorlib.dll, è sufficiente fornire il nome del tipo qualificato dal suo spazio dei nomi.


0

Possiamo usare

Type.GetType ()

per ottenere il nome della classe e puoi anche creare un oggetto usando 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; }
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.