0Pricing
C# Academy · Lekcja

Type, MethodInfo, aktywacja i własne atrybuty

Proszę pobierać obiekty Type, lokalizować MethodInfo, wywoływać metody, tworzyć instancje za pomocą Activator oraz definiować i odczytywać własne atrybuty.

Type, MethodInfo, aktywacja i własne atrybuty to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 1 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 3 lekcji w sumie.

Przegląd

Cel: Bezpiecznie używać refleksji.

  • Pobierać Type
  • Znajdować MethodInfo
  • Tworzyć za pomocą Activator
  • Definiować i odczytywać atrybuty

Pobieranie Type

Można pobrać Type za pomocą typeof, z instancji za pomocą GetType() albo po nazwie za pomocą 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

Należy użyć GetMethod, aby znaleźć metodę, oraz Invoke, aby ją wywołać. Należy przekazać instancję i tablicę argumentów.

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
  }
}

Podstawy aktywacji

Activator.CreateInstance(Type) konstruuje obiekt przy użyciu publicznego konstruktora bez parametrów.

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);
  }
}

Atrybuty niestandardowe

Należy utworzyć niewielką klasę Attribute i pobrać ją za pomocą GetCustomAttributes z typu lub metody.

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);
  }
}

Wskazówki i bezpieczeństwo

Wskazówki:

  • Należy sprawdzać, czy Type.GetType nie zwraca wartości null, oraz obsługiwać brakujące składowe.
  • W miarę możliwości należy preferować typeof (jest szybsze i bezpieczniejsze).
  • Należy centralizować użycie refleksji i dobrze je dokumentować.
  • Należy używać BindingFlags do wyszukiwania niepublicznych lub statycznych składowych.

Podstawy aktywacji

Szybkie sprawdzenie: które API tworzy instancję na podstawie obiektu Type, który ma publiczny konstruktor bez parametrów?

Podsumowanie

Podsumowanie: Należy pobrać obiekt Type, znaleźć MethodInfo, utworzyć obiekt za pomocą Activator i odczytać atrybuty przy użyciu GetCustomAttributes.

Często zadawane pytania

Czy lekcja „Type, MethodInfo, aktywacja i własne atrybuty” jest bezpłatna?

Tak — pełny tekst „Type, MethodInfo, aktywacja i własne atrybuty” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 3 lekcji w sumie.

Co nauczysz się w „Type, MethodInfo, aktywacja i własne atrybuty”?

Proszę pobierać obiekty Type, lokalizować MethodInfo, wywoływać metody, tworzyć instancje za pomocą Activator oraz definiować i odczytywać własne atrybuty. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 3.

Ile czasu zajmuje lekcja „Type, MethodInfo, aktywacja i własne atrybuty”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Type, MethodInfo, aktywacja i własne atrybuty
  2. Informacje na poziomie źródła (atrybuty Caller)
  3. Lekkie scenariusze metaprogramowania
← Powrót do C# Academy