Reflexão C #: como obter referência de classe de string?

89

Quero fazer isso em C #, mas não sei como:

Eu tenho uma string com um nome de classe -eg: FooClasse quero invocar um método (estático) nesta classe:

FooClass.MyMethod();

Obviamente, preciso encontrar uma referência para a classe por meio de reflexão, mas como?

rutger
fonte

Respostas:

124

Você vai querer usar o Type.GetTypemétodo.

Aqui está um exemplo muito simples:

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 simples porque é muito fácil encontrar assim um tipo interno a uma mesma montagem. Por favor, veja a resposta de Jon para uma explicação mais completa sobre o que você precisa saber sobre isso. Depois de recuperar o tipo, meu exemplo mostra como invocar o método.

Andrew Hare
fonte
101

Você pode usar Type.GetType(string), mas precisará saber o nome completo da classe, incluindo o namespace e, se não estiver no assembly atual ou mscorlib, você precisará do nome do assembly. (Idealmente, use em Assembly.GetType(typeName)vez disso - acho isso mais fácil em termos de obter a referência de montagem certa!)

Por exemplo:

// "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
fonte
1
+1 Muito bem - adicionei uma resposta que mostra como usar o tipo depois de recuperá-lo. Se quiser, vá em frente e mescle meu exemplo com sua resposta e eu irei deletar o meu.
Andrew Hare
Dado que o seu já foi aceito, sugiro que façamos o contrário - adicione o meu conteúdo à sua resposta e vou deletar este :)
Jon Skeet
4
Apenas para estender sua resposta ainda mais, se você não tiver certeza do que passar como texto para a função GetType e puder acessar essa classe, olhe para typeof (class) .AssemblyQualifiedName, isso lhe dará uma ideia clara.
techExplorer
10

Um uso simples:

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

Amostra:

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

Um pouco tarde para a resposta, mas isso deve resolver

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

seu nome qualificado de montagem deve ser assim

"Boom.Bam.Class, Boom.Bam, Version=1.0.0.262, Culture=neutral, PublicKeyToken=e16dba1a3c4385bd"
Atul Chaudhary
fonte
4
Obrigado por esclarecer explicitamente como deve ser o nome qualificado do assembly.
Desenhou em
3

Via Type.GetType você pode obter as informações de tipo. Você pode usar essa classe para obter as informações do método e, em seguida, invocar o método (para métodos estáticos, deixe o primeiro parâmetro nulo).

Você também pode precisar do nome do Assembly para identificar corretamente o tipo.

Se o tipo estiver no assembly em execução no momento ou em Mscorlib.dll, será suficiente fornecer o nome do tipo qualificado por seu namespace.

GvS
fonte
0

Podemos usar

Type.GetType ()

para obter o nome da classe e também pode criar um objeto dela 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
fonte