Reflexión de C #: ¿Cómo obtener la referencia de clase de la cadena?

90

Quiero hacer esto en C #, pero no sé cómo:

Tengo una cadena con un nombre de clase -eg: FooClassy quiero invocar un método (estático) en esta clase:

FooClass.MyMethod();

Obviamente, necesito encontrar una referencia a la clase a través de la reflexión, pero ¿cómo?

rutger
fuente

Respuestas:

125

Querrá utilizar el Type.GetTypemétodo.

Aquí tienes un ejemplo muy 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");
    }
}

Digo simple porque es muy fácil encontrar un tipo de esta manera que sea interno al mismo ensamblaje. Consulte la respuesta de Jon para obtener una explicación más detallada de lo que necesitará saber al respecto. Una vez que haya recuperado el tipo, mi ejemplo le muestra cómo invocar el método.

Andrew Hare
fuente
101

Puede usar Type.GetType(string), pero necesitará saber el nombre completo de la clase, incluido el espacio de nombres, y si no está en el ensamblado actual o en mscorlib, necesitará el nombre del ensamblado en su lugar. (Idealmente, useAssembly.GetType(typeName) en lugar, ¡me parece más fácil en términos de obtener la referencia de ensamblaje correcta!)

Por ejemplo:

// "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
fuente
1
+1 Bien hecho: agregué una respuesta que muestra cómo usar el tipo una vez que lo haya recuperado. Si lo desea, siga adelante y combine mi ejemplo con su respuesta y eliminaré el mío.
Andrew Hare
Dado que el suyo ya ha sido aceptado, sugiero que lo hagamos al revés: agregue mi contenido a su respuesta y eliminaré este :)
Jon Skeet
4
Solo para extender su respuesta aún más, si no está seguro de qué pasar como texto a la función GetType y puede acceder a esta clase, mire typeof (class) .AssemblyQualifiedName, esto le dará una idea clara.
techExplorer
10

Un uso sencillo:

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

Muestra:

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

Un poco tarde para responder, pero esto debería funcionar

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

su nombre calificado de ensamblaje debe ser así

"Boom.Bam.Class, Boom.Bam, Version=1.0.0.262, Culture=neutral, PublicKeyToken=e16dba1a3c4385bd"
Atul Chaudhary
fuente
4
Gracias por aclarar explícitamente cómo debería verse el nombre calificado de ensamblado.
Dibujó el
3

A través de Type.GetType puede obtener la información del tipo. Puede usar esta clase para obtener la información del método y luego invocar el método (para métodos estáticos, deje el primer parámetro nulo).

Es posible que también necesite el nombre del ensamblado para identificar correctamente el tipo.

Si el tipo está en el ensamblado que se está ejecutando actualmente o en Mscorlib.dll, es suficiente proporcionar el nombre del tipo calificado por su espacio de nombres.

GvS
fuente
0

Nosotros podemos usar

Type.GetType ()

para obtener el nombre de la clase y también puede crear un objeto 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; }
    }
}
Amol Bhor
fuente