Megjegyzések
- ezek az osztályok között sincs öröklődés vagy semmi.
- Az egyszerű reflexió bármikor megmondja az Ön jelenlegi módszereit. . Ehhez nem kell teljes veremkövetés '. Ez a kérdés valószínűleg a StackOverflow-hoz tartozik.
- @JimmyHoffa A kérdés általános OO-módszereket keres erre (ellentétben az alábbi válaszom eredeti verziójával).
- Tudna-e összeállítani AssemblyA és a assemblyB örökölje az assemblyC-t, így mindketten hozzáférhetnek ehhez a módszerhez? Vagy a MethodFoo () statikussá tehető, így nem kell ' valójában az adott osztályba tartozó objektumot létrehozni ahhoz, hogy felhívhassa?
- miért kellene ? ha más viselkedésre van szüksége, akkor hozzon létre különböző módszereket, vagy adjon át egy paramétert
Válasz
Nincs tudomásom általánosról vagy a programozási nyelvek közös mintái. Legtöbben dedikált reflexiós API-kkal kezelik.
A .Net-ben használja a System.Diagnostics.StackFrame és a System.Diagnostics.StackTrace osztályok. Például lásd: https://stackoverflow.com/questions/12556767/how-to-get-current-line-number-for-example-use-at-messagebox-show/12556789#12556789 . Más nyelveknek és környezeteknek lehetnek ekvivalenseik.
Megjegyzések
- Igen, de van-e objektum-orientált megoldás erre? így elkerülhető a StackTrace
- @BDotA: Ha érdekel, ki hívott, ' nem csinálsz OOP-t. Gondold át, mi vagy próbálkozik. (Elismerem, hogy a .NET gyakran nem OO, és néha el kell hagynunk az OO-t, amikor használjuk, de érdemes tudnunk hogy ' újra így, még akkor is, ha ezt mindenképp meg kell tennünk.)
Válasz
Kifelé megyek itt egy végtag, és kitalálja, hogy objektumorientált technikákat keres a műszerezés megvalósításához.
Két azonnali mód jut eszembe, a leggyakrabban használt módszer az első, amit tippelek:
-
Legyen egy globális (szingulett vagy mi van) verem valahol, amellyel minden végrehajtott módszer azonnal hozzáadja magát. hatékonyan fenntartja a globális hívásláncot. Nem szabad, hogy a Minden műszer végén, amelyet műszerezni próbál, a szokásos műszeres gyakorlat szerint stoppert indít a módszer elején, a végén pedig leállítja a hossz rögzítését stb.
-
Rendelkezzen olyan DI típusú keretrendszerrel, amely egy útválasztó az összes metódushíváshoz, ami viselkedhet Ez sokkal inkább hasonlít az üzenet továbbítására, és ennek a keretrendszernek a tetején felírna minden metódushívást, amely a fentihez hasonlóan fordul elő, kivéve, ha erre az egy helyre központosítaná.
Nem mondhatom, hogy a 2. sz. javaslatot teszem anélkül, hogy esetleg használnék valamilyen AOP keretrendszert, vagy valami, de a saját verem nyomának fenntartása a metódushívások 100% -án kissé extrém műszer a szememben. Nagyszerű a típusú dolgok hibakereséséhez, és talán szükséges, ha nem reflexív nyelven dolgozol, de biztos lennék abban, hogy bármi hasonlót könnyen kikapcsolhatnék a gyártáshoz, és mindent megteszek, hogy megakadályozzam az utat, ezért nagyon nem tetszik a fenti 2. sz..
Ezek egyikére sem szükség van egy reflexív nyelvben, ezért nem szabad C # nyelven megvalósítani, csak az átlépési folyamat szemléltetésére. határok. (figyelmeztetés: lehet, hogy gyorsabbak, mint a tükrözés, ha jól csinálják, de a karbantartási költségek mégsem érik meg őket)
Megjegyzések
- Köszönöm az ötleteket, ezért a C # -ban hogyan tudom megcsinálni Reflection-el? Nem tudom, ha áthelyezhetem ezt a bejegyzést SO-ra? vagy másolja be a beillesztést, és hozzon létre egy új bejegyzést SO-ban egy jó ötlet … szóval, ha tudnál segíteni a Reflection módon, nagyszerű lenne.
- @BDotA Nézd meg a stackoverflow.com/questions/171970/ … , bár azt hittem, hogy felidéztem egy módszert anélkül, hogy az
StackFrame
I objektumot meghívtam volna a haven ' nem találta meg. A fenti technikákat még mindig nem szabad C # nyelven végrehajtani, inkább használja aStackFrame
-et, ha szükséges.
Válasz
IMHO, komolyan kérdezd meg magadtól, miért gondolod, hogy erre van szükséged.
Ha a MethodFoo()
másképp viselkedik, ha az A vagy B összeállításból hívják meg, akkor a hívó összeállítás valami rejtett bemeneti paraméter a MethodFoo()
és valószínűleg a váratlan vagy téves viselkedés okává válhat.Tehát alternatívaként tegye egyértelművé azt a bemeneti paramétert: adjon hozzá egy további paramétert a MethodFoo()
elemhez, amely jelzi a kontextust vagy a hívót. Ez lehet egy enum
, egy string
paraméter, vagy hivatkozás magára a hívó összeállításra, a MethodFoo()
.
Megjegyzések
- Ó kedves, nem tettem ' t képzelje el, hogy megpróbálta irányítani az áramlást, ez ' nagyon ijesztő gondolat … Nyilvánvalóan sokkal pesszimistább vagy, mint én, hogy erre a következtetésre jutottál, de sajnos te igaza lehet ..
- @JimmyHoffa: ha valaki ilyen kérdést tesz fel anélkül, hogy bármit is említene a szándékáról, gyanús leszek 😉