C# Reflexión: ¿Cómo obtener una referencia de clase a partir de una cadena?
Quiero hacer esto en C#, pero no sé cómo:
Tengo una cadena con un nombre de clase, por ejemplo: FooClass
y 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?
Querrás utilizar el Type.GetType
mé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.
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");
Un uso sencillo:
Type typeYouWant = Type.GetType("NamespaceOfType.TypeName, AssemblyName");
Muestra:
Type dogClass = Type.GetType("Animals.Dog, Animals");
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"