С# Reflection: Как получить ссылку на класс из строки?

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

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

FooClass.MyMethod();

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

Ответ 1

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

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

Ответ 2

Вы можете использовать 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 in the current assembly"
Type myType = Type.GetType("MyNamespace.MyType");

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

Ответ 3

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

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

Пример:

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

Ответ 4

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

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

ваше квалифицированное имя сборки должно выглядеть следующим образом

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

Ответ 5

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

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

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

Ответ 6

Мы можем использовать

Type.GetType()

получить имя класса, а также создать его объект, используя 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; }
    }
}