C# отражение: как получить ссылку на класс из строки?


Я хочу сделать это в C#, но я не знаю как:

у меня есть строка с именем класса-например:FooClass и я хочу вызвать (статический) метод для этого класса:

FooClass.MyMethod();

очевидно, мне нужно найти ссылку на класс через отражения, но как?

5 71

5 ответов:

вы хотите использовать Type.GetType метод.

вот очень простой пример:

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

Я говорю:простой потому что очень легко найти тип таким образом, который является внутренним для той же сборки. Пожалуйста, смотрите Джон для более подробного объяснения того, что вам нужно будет знать об этом. После того, как вы получили тип мой пример показывает вам, как вызвать метод.

можно использовать Type.GetType(string), но вы должны знать полное имя класса, включая пространство имен, и если оно не находится в текущей сборке или mscorlib, вам понадобится имя сборки. (В идеале, используйте Assembly.GetType(typeName) вместо - Я считаю, что проще с точки зрения получения ссылки на сборку право!)

например:

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

простой использовать:

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

пример:

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

немного поздно для ответа, но это должно сделать трюк

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

ваше полное имя сборки должно быть таким

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

через тип.GetType вы можете получить информацию о типе. Вы можете использовать этот класс сделать метод информация, а потом вызов метод (для статических методов, оставьте первый параметр равен null).

Вам также может понадобиться имя сборки для правильной идентификации типа.

Если тип находится в текущий момент выполнение сборки или в Mscorlib.файл DLL, достаточно, чтобы поставить типа имя с указанием пространства имен.