..
Co se deje pri prekladu
- C# zdrojaky s priponou .cs
- prelozi se do CIL kodu, pripona .dll, ulozi se metadata o typech a metodach
- nastroje jako ildasm nebo ILSpy umi pomoci tech metadat zrekonstruovat (ekvivalnetni) zdrojaky
- JIT a CLR to pak prelozi do strojoveho kodu cilove platformy
V .NET je nejaka sada trid, ktera umoznuje zkoumat metadata assemblies, ktere jsou nahrade v te CLR, ve ktere bezim.
Typ Type
- instance tridy type odpovidajici danenu typu ziskame pomoci
typeof(T)
, kdeT
je trida, nebox.GetType()
, kdex
je instance - objekty na heapu maji v sobe ukazatel na tuto instanci tridy type
Typ Assembly
Ma staticke metody, vsechny vraci nejakou instanci tridy Assembly
Assembly.GetExecutingAssembly()
- vrati assembly, ve ktere je tento radek kodu realne. Pokud mam metodu v assembly A, ktera vola metodu v assembly B, ktera obsahuje tento radek, tak vrati BAssembly.GetCallingAssembly()
- vrati assembly, ktera se na to realne pta –> AAssembly.GetEntryAssembly()
- vrati entry-point toho celeho programu
// Get types implementing ISimplisticRoutesHandler from the calling assembly
Type[] types = Assembly.GetCallingAssembly().GetTypes()
.Where(t => t.GetInterfaces().Contains(typeof(ISimplisticRoutesHandler)))
.ToArray();
Metody na instanci typu Assembly:
Type[] .GetTypes()
- vrati vsechny typy v assemblyType? .GetType(string name)
- vrati typ podle jmena
Metody na instanci typu Type vraci instance potomku abstraktni tridy Memberinfo
.GetFields()
- vrati poleFieldInfo
.GetProperties()
- vrati polePropertyInfo
atd.GetMethods()
.GetConstructors()
.GetEvents()
Type[] .GetInterfaces()
A obdobne veci jako
MethodInfo? .GetMethod(string name)
Co s tim?
Muzeme si zaridit python-like duck typing.
void RunMethod(object obj, object[] args, string methodName) {
MethodInfo? method = obj.GetType().GetMethod(methodName);
if (method != null) {
method.Invoke(obj, args);
}
}
Zajimave metody
MethodInfo? Type.GetMethod(string name, Type[] types)
- najde konkretni overload podle typu parametruobject MethodInfo.Invoke(object this, object[] args)
- zavola metodu na objektu s parametry a vrati vysledek. Kdyby to byla staticka metoda, tak tothis
jenull
. Hodnotove argumenty musi boxovat.- rekneme ze mame Typ
A
, ktery ma nestatickou metoduf
, kterou chceme zavolat, ale nemame instanci
var a = Activator.CreateInstance(typeof(A));
var m = aType.GetMethod(nameof(A.f));
m.Invoke(a, null);
Problemy reflection
- je strase pomala
- neni type-safe, snadny zdroj behovych chyb
- potencialne nebezpecna - da se pristupovat k private metodam a fieldum
- to neni spatne! Private veci nejsou nejak tajne, jen by je
- proto ty petody
.GetMethods
,.GetFields
atd maji overloady s parametremBindingFlags
, kde se da nastavit, co vsechno chci videt
- uzivatele toho API nemeli pouzivati