C # Reflection: Як отримати посилання на клас із рядка?


90

Я хочу зробити це на C #, але не знаю як:

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

FooClass.MyMethod();

Очевидно, мені потрібно знайти посилання на клас шляхом роздумів, але як?

Відповіді:


125

Ви захочете скористатися 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");
    }
}

Я кажу просто, тому що дуже легко знайти тип, який є внутрішнім для тієї самої збірки. Будь ласка, перегляньте відповідь Джона для більш детального пояснення того, що вам потрібно буде знати про це. Отримавши тип, мій приклад показує, як викликати метод.


101

Ви можете використовувати 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

Ми можемо використовувати

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; }
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.