[c#] Zichtbaar maken van non-public members

Pagina: 1
Acties:

  • reyan
  • Registratie: November 2003
  • Laatst online: 17-12-2021
En weermaals hebben we een vraag... Ik vroeg me namelijk af of het enigszins mogelijk is om de non-public members van een class te benaderen. Wanneer ik die class zelf heb geschreven is dat natuurlijk makkelijk door private in public te veranderen of er public properties voor aan te maken, maar wat met bestaande classes?

Een voorbeeld zegt meer dan woorden:

Afbeeldingslocatie: http://tweakers.net/ext/f/4fe6a83e4ccb230815e186485a59f046/full.png

Het (Npgsql.NpgsqlDataReader)sqlResult object heeft maar enkele publieke properties. Maar toch wil ik meer informatie uit het object halen. Ik wil namelijk weten (puur als voorbeeld) welk DbType de tweede kolom heeft in de sql resultset. Zoals je ziet moet ik dan een aantal private members kunnen benaderen, maar hoe doe je dat?

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 15-02 20:01
Reflection?

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
meestal hebben private members een getter en setter om ze te benaderen. Echter als ze zo private zijn dat de buitenwereld ze in geen geval nodig heeft zullen deze niet geimplementeerd zijn.

This message was sent on 100% recyclable electrons.


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:19
Het is mogelijk om het mbhv Reflection te doen. Je kan een lijst opvragen van alle non-public members, en je kan hun waarde zetten en opvragen. Echter, het is niet echt aangeraden om dat te doen, aangezien er wel een reden zal zijn dat die members niet public zijn.

Zie ook hier:
[rml][ .NET] Safe code[/rml]

[ Voor 13% gewijzigd door whoami op 25-06-2006 15:04 ]

https://fgheysels.github.io/


  • reyan
  • Registratie: November 2003
  • Laatst online: 17-12-2021
Bedankt voor jullie antwoorden!

Dat het niet aangeraden is vermoedde ik zelf ook al, anders had men nooit private members geïntroduceerd. Maar in sommige gevallen heb je toch echt een bepaalde member nodig waar je niet aan kan omdat hij non-public is. Zolang ik het puur read-only gebruik, lijkt het me toch vrij veilig? Niet?

Anders, hoe zouden jullie mijn voorbeeld oplossen zonder Reflection? Dat lukt toch niet?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 14-02 12:34

gorgi_19

Kruimeltjes zijn weer op :9

reyan schreef op zondag 25 juni 2006 @ 15:21:
Dat het niet aangeraden is vermoedde ik zelf ook al, anders had men nooit private members geïntroduceerd. Maar in sommige gevallen heb je toch echt een bepaalde member nodig waar je niet aan kan omdat hij non-public is. Zolang ik het puur read-only gebruik, lijkt het me toch vrij veilig? Niet?
Niet gegarandeerd, anders zou hij niet private zijn :)
Anders, hoe zouden jullie mijn voorbeeld oplossen zonder Reflection? Dat lukt toch niet?
Niet

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:19
Maar in sommige gevallen heb je toch echt een bepaalde member nodig waar je niet aan kan omdat hij non-public is.
Als hij niet public niet is; dan is het ook niet de bedoeling dat jij 'm nodig hebt.

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 03-02 12:37

pjvandesande

GC.Collect(head);

Heb je de waarde echte nodig of kun je het ook op een anderen manier oplossen?

  • reyan
  • Registratie: November 2003
  • Laatst online: 17-12-2021
questa schreef op maandag 26 juni 2006 @ 12:10:
Heb je de waarde echte nodig of kun je het ook op een anderen manier oplossen?
Sorry voor de trage reply... Ja, ik heb die gegevens echt nodig en voor zover ik weet is er geen andere manier om die gegevens direct op te halen zonder reflection :)

In het laatste Microsoft .NET magazine staat er trouwens ook een artikel over. Men raad het gebruik van dit soort reflection niet aan, maar soms kom je er niet te buiten. Wel heeft het een performance impact, maar ik heb het slechts zelden nodig en nooit in een loop waar performance van belang kan zijn.

Dus ik denk dat ik die reflection maar ga gebruiken. Ik heb het geheel intensief getest en er schijnen (in mijn geval) geen nadelen of problemen aan vast te hangen.

[ Voor 12% gewijzigd door reyan op 05-07-2006 11:41 ]


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 03-02 12:37

pjvandesande

GC.Collect(head);

reyan schreef op woensdag 05 juli 2006 @ 11:41:
[...]
Wel heeft het een performance impact, maar ik heb het slechts zelden nodig en nooit in een loop waar performance van belang kan zijn.
Nee, je kunt het geheel goed perform houden! Je kunt hiervoor Dynamic Code genereren, dit leverd zo'n 75% winst op!
Hier zou je dus ook naar kunnen kijken. Je hebt wel reflection nodig om eenmalig alles uit te zoeken of je moet met dispatch gaan werken, maar aangezien het niet je eigen lib zou ik me hier niet aan vast pinnen.
Pagina: 1