Refleksija yra labai galingas ir patogus būdas sužinoti objekto metaduomenis, bet viena didžiausių jos problemų (apart greitaveikos) – eilučių naudojimas. Tarkime, mes turime klasę Demo:

Norėdami refleksijos pagalba gauti priėjimą prie klasės savybės Text ir metodo Print, tai atrodytų taip:

Kaip matote, tam kad gauti PropertyInfo ar MethodInfo, reikia nurodyti objekto savybės ar metodo pavadinimą. Problema tame, kad pavadinimai yra tekstinės eilutės, todėl pasikeitus objekto savybės ar metodo pavadinimui, kodas ir toliau kompiliuosis, o apie klaidą sužinosime tik programos vykdymo metu.
Šiai problemai išspręsti galima pasirašyti pagalbinius metodus, kurie kaip argumentus priimtų Lamda išraiškas. Tai leis tipizuotai nurodyti pageidaujamą savybę ar metodą:

Žemiau yra pateiktas Reflector klasės kodas:

Reflector klasę jus rasite ir mano SBToolkite. Tikiuosi jūsų darbas su refleksija dar labiau pagerės!
Rodyk draugams






2009-04-16 09:06
Aš šiaip nieko prieš lietuvių kalbą, bet kut tu tokių žodžių randi? Paskaites pavadinimą kelias minutes galvojau, kas ta refleksija…
2009-04-16 09:15
Dar prie to pačio, pagal Lietuvių kalbos žodyną šio termino reikšmės tik 2:
reflèksija sf. (1) DŽ
1. fiz. spindulių atsispindėjimas.
2. fil. savo minčių ir išgyvenimų analizė.
nesvarbu, kad google taip verčia :)
nors iš kitos pusės geriau nei nieko..
2009-04-16 14:47
ne akademinis gi tekstas čia koks. visi, kam reikia - supranta apie ką kalbama. O LKŽ sunkiai spėja prisitaikyti pagal naujos terminologijos atsiradimą.
2009-04-17 00:20
@Mantas:
Oficialiai pas mus daug programavimo terminų nėra išversta, bet kas tai draudžia mums patiems eksperimentuoti? VLKK gal ras mūsų terminus, jie patiks ir taps oficialūs ;)
2009-04-21 13:18
Bet Sergėjau, norint pasinaudoti šiuo helper metodu, reikės į assembly įtraukti ir klasę ar interfeisą (kad compile time'u būtų atrenkami metodai), tai tada klausimas, jei viskas įtraukta, kam naudotis reflection'u? :)
Kiek teko dirbti, pati reflection'o galia ir atsiskleidžia tada, kai nežinai su kokiu objektu dirbsi, arba žinai tik base klases.
2009-04-21 19:48
@Raimondas
Man porą kartų tas dalykas pagelbėjo, kada tu žinai savybę, bet nežinai realios tos savybės reikšmės. Pvz.:
class Tuple
{
object First { get; set; }
object Last { get; set; }
}
P.S. Taip, aš žinau, kad gali būti Tuple<TF, TL>, bet čia tiesiog pvz.
Buvo dar vienas atvejis, bet jo dabar neatsimenu.
2009-04-22 08:44
IMHO, man properčio gavimas compile-time yra labai svarbus dalykas.
Mūsų visas softas paremtas refleksija, ir pvz kuriant windowsines formas mes visur į properčius kreipiamės tiesiog per stringus, pvz groupBox.AddControl(controlBuilder.GetControl("Company"))
toks kodas automatiškai sukurtų lauką, kuris yra nuoroda į kompaniją iš tėvinio objekto (kad ir koks jis bebūtų). Va tik visa bėda, kad "Company" yra stringas, ir kai keičiame duombazę, tai retokai, bet vis tiek kartais užsirauname.
2009-04-22 08:45
Tai vien dėl to pradėjau svarstyti apie perėjimą prie .Net 3.5, nes dabar visas softas ant .Net 2.0