C # Reflection: Как получить ссылку на класс из строки? - PullRequest
78 голосов
/ 25 июня 2009

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

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

FooClass.MyMethod();

Очевидно, мне нужно найти ссылку на класс с помощью рефлексии, но как?

Ответы [ 5 ]

113 голосов
/ 25 июня 2009

Вы захотите использовать метод 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");
    }
}

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

88 голосов
/ 25 июня 2009

Вы можете использовать Type.GetType(string), но вам нужно знать имя класса full , включая пространство имен, и, если оно отсутствует в текущей сборке или 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");
7 голосов
/ 18 сентября 2014

Простое использование:

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

Пример:

Type dogClass = Type.GetType("Animals.Dog, Animals");
5 голосов
/ 25 июля 2014

Задержка ответа, но это должно сработать

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

Ваше имя, указанное в сборке, должно быть таким:

"Boom.Bam.Class, Boom.Bam, Version=1.0.0.262, Culture=neutral, PublicKeyToken=e16dba1a3c4385bd"
3 голосов
/ 25 июня 2009

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

Вам также может понадобиться Имя сборки , чтобы правильно определить тип.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...