Hogyan lehet megváltoztatni az osztály - verem túlcsordulásban lévő egyes mezők értékeit oroszul

Olyan osztályt írok, amely felelős a programbeállítások működésének szabályozásáért. Olyan módszerre van szükségem, amely minden tulajdonságot alapértelmezett értékre állít be. Eljöttem a zsákutcába, nem tudom, hogyan kell befejezni a kérdést. kód:







Ha általánosan használom, problémát tapasztalok. Szükségem van arra, hogy a mezőbe bejusson az érték a rendszerleíró adatbázisból, ezt írom:

vissza Convert.ToInt32 (res); - probléma - hogyan kell megadni, hogy vissza kell adnunk egy T típusú változót?

És még egy megjegyzés. A beállítás a név + érték, vagy a név + érték + alapértelmezett érték. Ami engem illet - nos, a név + alapértelmezett érték nem illeszkedik ide + indításhoz, amikor az operációs rendszer elindul. Valami nincs így megtervezve. Csináljuk újra. Van egy beállítás, van egy sor beállítás. Mindegyikük csak karakterlánc, vagy létezik Int, Bool és így tovább? - A K, március 26., 12:46 órakor

@AK Azt akartam csinálni okosan, hogy a konfigurációs példány Érték mezője határozza meg a példány létrehozásakor. Ezt a témát nem elsajátítottam, és úgy döntöttem, hogy az érték csak egyfajta karakterlánc, és ott szükséges vezetni. A „indul el, amikor elindítja az operációs rendszer”, a logika ugyanaz marad, csak ha IGEN - bejegyzi a nyilvántartásba a kívánt vonal - ha nem törli - Antykus március 26 at 00:52

Először keressük meg, hogyan lehet ezt technikailag elvégezni.

Először is, hogyan kapok egy listát az összes mezőről? Van a Type.GetFields () metódusunk. de mi a mi típusunk? típus (Options) nem lehet a mi igazi típusunk, hirtelen gyerekkori osztályt készítettünk? A helyes módszer a típus megszerzéséhez a GetType () módszer.







Melyik mezőket szeretnénk megkapni? Nyílt (nyilvános és privát) mezőkre van szükségünk: rendszerint a mezők el vannak rejtve, de a tulajdonságok megnyílnak. Emellett szükségünk van a példánymezőkre, de nem statikus mezőkre. A GetFields metódus azonban csak az õs osztályok nyitott mezõit adja vissza, így minden alaptípuson át kell iterálni.

Ha minden típust megismétlődünk, nem kell az örökölt mezőket átvennünk, ezért a BindingFlags.DeclaredOnly módosítót a GetFields-ben tápláljuk.

Ez a következő kódhoz vezet:

Mi van a hurokban? Meg kell adnunk az alapértelmezett értéket. Ha ez az érték az ilyen típus alapértelmezett (T), akkor a következő kód használatával kaphatja meg:

Ez ellenőrzi, hogy a típusunk jelentős-e, vagy referenciatípus. Referencia típus esetén az alapértelmezett érték nulla. és a fontos típus alapértelmezett konstruktorral rendelkezik.

Ha az alapértelmezett értéket az egyik mezőben tárolja, és megkülönbözteti a név szerint, akkor nem világos, hogy mit kell tennie, ha a mezőtípus és az alapértelmezett értéktípus eltérő. Az Ön esetében egyszerűen csak írhat:

és ha el szeretné kerülni az alapértelmezett érték hozzárendelését, ellenőriznie kell a nevét és a tagságát (mert számos mező ugyanazt a nevet tartalmazhatja):

Most a problémákról.

Kezdőknek, mezőknek. Értékeket rendelhet a mezők kitérő tulajdonságaihoz. Ez nem teljesen helyes, mert a hozzárendelés tulajdonságai valamilyen logikát hajthatnak végre, amelyet hiányol a megközelítésnél. (Ez a probléma részben megoldható a mezők helyett a tulajdonságokkal dolgozva, de ha az osztály olyan mezőket tartalmaz, amelyek nem férnek hozzá a tulajdonságokhoz, akkor nem kerülheti el a problémákat.)

Ezután az alapértelmezett érték. Ez az érték nem lehet jó kezdeti érték minden mező számára. Ha az alapértelmezett (T) értéket használja. akkor a stringhez a helyes érték lehet "" vagy ott "(none)". A gondolkodás teljesen eltörli ezt.

Továbbá egy reflexió, akkor nem tudja elhagyni a nullázás bizonyos területeken az eltéréssel, hogy meg kell adnia attribútumokat, és arra kényszeríti a felhasználót, hogy csatolja az attribútumokat a mezőket, amelyek befolyásolják a viselkedését a módszer nullázódik. Ez ártatlan jellemzővé válik egy egész keretbe.




Kapcsolódó cikkek