Co je reflexe?

  • Reflexe je mechanismus, který umožňuje získávat informace o typech, objektech, metodách a atributech za běhu programu.

Příklady využití:

  • Dynamická serializace/deserializace (např. do JSON)
  • Vlastní ORM knihovny
  • Dynamické vytváření objektů
  • Zjišťování, zda objekt obsahuje určitou metodu, vlastnost apod.

Práce s typy přes reflexi

  • Získání Type objektu:
Custommer c = new Custommer();
Type t = c.GetType();         // z instance
Type t2 = typeof(Custommer);  // z typu
Type t3 = Type.GetType("Namespace.ClassName"); // z názvu
  • Vlastnosti typu:
t.IsClass, t.IsAbstract, t.IsEnum, t.IsArray, t.IsPrimitive, ...

Zjišťování informací o členech typu

Metody

MethodInfo[] methods = t.GetMethods();
foreach (var m in methods) {
    Console.WriteLine($"{m.Name} vrací {m.ReturnType}");
}

Vlastnosti a pole

PropertyInfo[] props = t.GetProperties();
FieldInfo[] fields = t.GetFields();

Parametry metod

MethodInfo m = t.GetMethod("SomeMethod");
ParameterInfo[] parameters = m.GetParameters();

Atributy

  • Atributy umožňují programátorům připojit metadata ke kódu, která jsou pak dostupná přes reflexi.

  • Příklady:

    • [Serializable]
    • [HttpGet], [HttpPost]
    • [PrimaryKey], [NonSerialized]
  • Použití:

[Serializable]
public class Student { ... }

Čtení atributů pomocí reflexe

FieldInfo[] fields = t.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (FieldInfo f in fields) {
    object[] attrs = f.GetCustomAttributes(false);
    foreach (object a in attrs) {
        Console.WriteLine(a.GetType());
    }
}

Kontrola na konkrétní atribut:

if (m.GetCustomAttributes(typeof(ThreadStaticAttribute), true).Length > 0) {
    // metoda má atribut
}

Vlastní atributy

  • Lze vytvářet vlastní atributy děděním ze třídy System.Attribute:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property)]
public sealed class MyAttribute : Attribute {
    public string Info { get; set; }
    public MyAttribute(string info) {
        Info = info;
    }
}
  • Použití:
[My("Poznámka")]
public class MyClass { ... }

Reflexe – úskalí a doporučení

  • Reflexe je výkonná, ale náročná na výkon – VM nemůže provádět optimalizace.
  • Neměla by se používat, pokud existuje standardní přístup.
  • Je možné získat a volat i non-public členy, což má bezpečnostní dopady.
  • V některých prostředích může být reflexe zakázaná (sandbox).

Shrnutí

  • Reflexe umožňuje dynamickou práci s typy a objekty během běhu programu.
  • Atributy přidávají metadata, která lze zpracovat pomocí reflexe.
  • Kombinace reflexe a atributů je základ pro:
    • ORM nástroje (např. Entity Framework)
    • Serializátory (např. System.Text.Json)
    • Dynamické validace, testování, mapování
  • Správné použití reflexe vede k silným a flexibilním nástrojům – ale je třeba s ní zacházet uvážlivě.