C# Reflexión: ¿Cómo obtener una referencia de clase a partir de una cadena?

Resuelto rutger asked hace 15 años • 6 respuestas

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

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

FooClass.MyMethod();

Obviamente, necesito encontrar una referencia a la clase mediante la reflexión, pero ¿cómo?

rutger avatar Jun 25 '09 22:06 rutger
Aceptado

Querrás utilizar el Type.GetTypemétodo.

Aquí hay 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 conjunto. 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 avatar Jun 25 '2009 15:06 Andrew Hare

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. (Lo ideal es utilizarlo Assembly.GetType(typeName)en su lugar; ¡me resulta 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 avatar Jun 25 '2009 15:06 Jon Skeet

Un uso sencillo:

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

Muestra:

Type dogClass = Type.GetType("Animals.Dog, Animals");
André Voltolini avatar Sep 18 '2014 13:09 André Voltolini

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

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

su nombre calificado de ensamblaje debería ser así

"Boom.Bam.Class, Boom.Bam, Version=1.0.0.262, Culture=neutral, PublicKeyToken=e16dba1a3c4385bd"
Atul Chaudhary avatar Jul 25 '2014 01:07 Atul Chaudhary