0Pricing
C# Academy · Урок

Type, MethodInfo, активация и пользовательские атрибуты

Получайте объекты Type, находите MethodInfo, вызывайте методы, создавайте экземпляры с помощью Activator и определяйте и считывайте пользовательские атрибуты.

«Type, MethodInfo, активация и пользовательские атрибуты» — бесплатный урок C# Academy на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.

Обзор

Цель: безопасно использовать отражение.

  • Получать Type
  • Находить MethodInfo
  • Создавать экземпляры через активатор
  • Определять и считывать атрибуты

Получение Type

Получайте Type через typeof, из экземпляра с помощью GetType() или по имени через Type.GetType.

using System;

public class Sample { }

public class Program
{
  public static void Main(string[] args)
  {
    // 1) From a compile-time type
    Type t1 = typeof(Sample);

    // 2) From an instance
    Sample s = new Sample();
    Type t2 = s.GetType();

    // 3) From a full name (needs assembly-qualified name for external types)
    Type t3 = Type.GetType("System.String");

    Console.WriteLine(t1.Name + ", " + t2.FullName + ", " + (t3 == null ? "null" : t3.Name));
  }
}

Вызов MethodInfo.Invoke

Используйте GetMethod, чтобы найти метод, и Invoke, чтобы его вызвать. Передайте экземпляр и массив аргументов.

using System;
using System.Reflection;

public class Greeter
{
  public string Hello(string name) { return "Hello, " + name; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Greeter g = new Greeter();
    Type t = typeof(Greeter);

    MethodInfo mi = t.GetMethod("Hello"); // public instance method
    object result = mi.Invoke(g, new object[] { "Ada" }); // call dynamically

    Console.WriteLine(result); // Hello, Ada
  }
}

Основы Activator

Activator.CreateInstance(Type) создаёт объект с помощью открытого конструктора без параметров.

using System;

public class Person
{
  public string Name { get; set; }
  public Person() { Name = "Unknown"; } // parameterless ctor
}

public class Program
{
  public static void Main(string[] args)
  {
    Type tp = typeof(Person);
    object o = Activator.CreateInstance(tp); // uses public parameterless ctor
    Person p = (Person)o;
    p.Name = "Alan";
    Console.WriteLine("Created: " + p.Name);
  }
}

Пользовательские атрибуты

Создайте небольшой класс Attribute и получите его через GetCustomAttributes у типа или метода.

using System;
using System.Reflection;

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class LabelAttribute : Attribute
{
  public string Text { get; private set; }
  public LabelAttribute(string text) { Text = text; }
}

[Label("Utility class")]
public class Utils
{
  [Label("Adds two ints")]
  public static int Add(int a, int b) { return a + b; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Type t = typeof(Utils);

    // Read class attribute
    object[] classAttrs = t.GetCustomAttributes(typeof(LabelAttribute), false);
    if (classAttrs.Length > 0)
      Console.WriteLine("Class label: " + ((LabelAttribute)classAttrs[0]).Text);

    // Read method attribute
    MethodInfo mi = t.GetMethod("Add");
    object[] methodAttrs = mi.GetCustomAttributes(typeof(LabelAttribute), false);
    if (methodAttrs.Length > 0)
      Console.WriteLine("Method label: " + ((LabelAttribute)methodAttrs[0]).Text);
  }
}

Советы и безопасность

Советы:

  • Проверяйте значение null, возвращаемое Type.GetType, а также отсутствие членов.
  • По возможности отдавайте предпочтение typeof (это быстрее и безопаснее).
  • Сосредоточьте использование рефлексии в одном месте и хорошо документируйте его.
  • Используйте BindingFlags для поиска закрытых или статических членов.

Основы создания экземпляров

Быстрая проверка: какой API создаёт экземпляр из Type, у которого есть открытый конструктор без параметров?

Повторение

Повторение: получите Type, найдите MethodInfo, создайте экземпляр с помощью Activator и прочитайте атрибуты через GetCustomAttributes.

Часто задаваемые вопросы

Урок «Type, MethodInfo, активация и пользовательские атрибуты» бесплатный?

Да — полный текст урока «Type, MethodInfo, активация и пользовательские атрибуты» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.

Чему я научусь в уроке «Type, MethodInfo, активация и пользовательские атрибуты»?

Получайте объекты Type, находите MethodInfo, вызывайте методы, создавайте экземпляры с помощью Activator и определяйте и считывайте пользовательские атрибуты. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.

Сколько времени занимает урок «Type, MethodInfo, активация и пользовательские атрибуты»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Type, MethodInfo, активация и пользовательские атрибуты
  2. Информация на уровне исходного кода (атрибуты Caller)
  3. Сценарии легкого метапрограммирования
← Назад к C# Academy