Вопрос по reflection, c# – C # Reflection: Как получить ссылку на класс из строки?

76

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

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

<code>FooClass.MyMethod();
</code>

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

Ваш Ответ

5   ответов
4

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

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

"Boom.Bam.Class, Boom.Bam, Version=1.0.0.262, Culture=neutral, PublicKeyToken=e16dba1a3c4385bd"
Спасибо за ясное разъяснение того, как должно выглядеть имя, указанное в сборке.
3

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

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

If the type is in the currently executing assembly or in Mscorlib.dll, it is sufficient to supply the type name qualified by its namespace.

108

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 потому что таким способом очень легко найти тип, который является внутренним для той же сборки. Посмотри пожалуйстаОтвет Джона для более подробного объяснения того, что вам нужно знать об этом. Как только вы получили тип, мой пример показывает вам, как вызвать метод.

6

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

Образец:

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

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");
Учитывая, что ваше уже принято, я предлагаю сделать это наоборот: вы добавляете мой контент в свой ответ, а я его удалю :)
Чтобы еще больше расширить свой ответ, если вы не уверены, что передать в виде текста функции GetType, и вы можете получить доступ к этому классу, тогда посмотрите на typeof (class) .AssemblyQualifiedName, это даст ясную идею.
+1 Отлично сделано - я добавил ответ, который показываетhow использовать тип, как только вы его получили. Если вы хотите, продолжайте и объедините мой пример с вашим ответом, и я удалю мой.

Похожие вопросы