Cum se pot modifica valorile anumitor câmpuri conținute într - un overflow de stivă de clasă în limba rusă

Am scris o clasă care este responsabilă pentru reglarea funcționării setărilor programului. Trebuie să am o metodă care să stabilească toate proprietățile la o valoare implicită. Am ajuns la capăt, nu știu cum să termin problema. cod:







Dacă folosesc generic, întâmpinăm o problemă. Am nevoie de accesarea câmpului pentru a stabili valoarea din registru, scriu următoarele:

întoarcere Convert.ToInt32 (res); - problemă - cum să specificați că trebuie să returnați o variabilă de tip T

Și încă o observație. Setarea este numele + valoare, sau valoarea + valoarea + valoarea implicită. În ceea ce mă privește - bine, valoarea implicită + numele nu se potrivește aici + începe când începe sistemul de operare. Ceva nu este așa proiectat. Să o facem din nou. Există o setare, există un set de setări. Sunt toate cu sfoară sau pot fi int, bool și așa mai departe? - A Mar 26, la 12:46

@AK am vrut să o fac inteligent, astfel încât tipul câmpului Value pentru instanța de configurare a fost determinat când instanța a fost creată. Nu am stăpânit acest subiect și am decis să fac Valoarea doar un tip de șir și acolo este necesar să duc la ceea ce. Cu setarea "start when OS starts", logica ramane acelasi, doar daca YES - scriem linia dorita in registru, daca nu - stergem - Antykus pe 26 martie la 12:52 pm

Să vedem mai întâi cum se poate face acest lucru din punct de vedere tehnic.

În primul rând, cum obțin o listă a tuturor câmpurilor? Avem metoda Type.GetFields (). dar care este tipul nostru? typeof (Opțiuni) poate să nu fie tipul nostru real, dintr-o dată am produs o clasă pentru copii? Metoda corectă pentru obținerea unui tip este metoda GetType ().







În continuare, ce câmpuri vrem să primim? Avem nevoie de ambele câmpuri deschise (publice și private): de obicei, câmpurile sunt ascunse, dar proprietățile sunt deschise. În plus, avem nevoie de câmpurile de instanță, dar nu de câmpuri statice. Dar metoda GetFields returnează numai câmpurile deschise pentru clasele strămoșilor, așa că va trebui să repetăm ​​toate tipurile de bază.

Dacă vom itera peste toate tipurile, nu este nevoie să obțineți câmpurile moștenite, așa că alimentăm modificatorul BindingFlags.DeclaredOnly în GetFields.

Acest lucru duce la următorul cod:

Ce este în bucla? Trebuie să atribuim o valoare implicită. Dacă această valoare este implicită (T) de acest tip, atunci puteți să o obțineți utilizând următorul cod:

Aceasta verifică dacă tipul nostru este semnificativ sau tip de referință. Pentru tipul de referință, valoarea implicită este null. iar tipul semnificativ are un constructor implicit.

Dacă stocați valoarea implicită într-unul dintre câmpuri și diferențiați-o pe nume, nu este clar ce să faceți dacă tipul de câmp și tipul de valoare implicită sunt diferite. Pentru cazul tău, poți scrie simplu:

și dacă doriți să evitați să vă atribuiți o valoare implicită, trebuie să verificați numele și afilierea (deoarece pot exista mai multe câmpuri cu același nume):

Acum despre problemele.

Pentru început, câmpuri. Atribuiți valori câmpurilor ocolind proprietățile. Acest lucru nu este complet corect, deoarece proprietățile din misiune pot efectua un fel de logică pe care o pierdeți la abordarea dvs. (Această problemă poate fi rezolvată parțial prin lucrul cu proprietăți în loc de câmpuri, dar dacă clasa dvs. are câmpuri care nu se potrivesc cu proprietățile, nu puteți evita problemele.)

Apoi, valoarea implicită. Această valoare poate să nu fie o valoare inițială bună pentru toate câmpurile. Dacă utilizați valoarea implicită (T). atunci pentru șirul de caractere valoarea corectă ar putea fi "" sau acolo "" (niciuna) ". Reflecția îl șterge complet.

În plus, cu reflecție, nu puteți refuza eliminarea oricăror câmpuri, cu excepția cazului în care trebuie să introduceți atribute și obligați utilizatorul să atașeze atributele câmpurilor care afectează comportamentul metodei zero. Aceasta va transforma o caracteristică nevinovată într-un cadru întreg.







Articole similare

Trimiteți-le prietenilor: