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


92

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

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

FooClass.MyMethod();

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

Ответы:


127

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

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


103

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

1
+1 Отлично сделано - я добавил ответ, в котором показано, как использовать тип после того, как вы его получили. Если хотите, включите мой пример в свой ответ, а я удалю свой.
Эндрю Хэйр

Учитывая, что ваше уже было принято, я предлагаю сделать это наоборот - вы добавляете мой контент в свой ответ, а я удалю этот :)
Джон Скит

4
Чтобы расширить свой ответ, если вы не уверены, что передать как текст в функцию GetType, и у вас есть доступ к этому классу, посмотрите на typeof (class) .AssemblyQualifiedName, это даст четкое представление.
techExplorer

10

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

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

Образец:

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

7

Немного поздно для ответа, но это должно помочь

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

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

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

4
Благодарим вас за четкое разъяснение того, как должно выглядеть полное имя сборки.
Дрю

3

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

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

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


0

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

Тип.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; }
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.