Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C# 1.1] Runtime een variabele toevoegen aan bestaand object

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoe kan ik aan bestaand object extra publieke variabelen toevoegen via reflection of is dit niet mogelijk?

Voorbeeld:
code:
1
2
3
4
5
6
class a
{
   public void dummyMethod()
   {
   }
}


wat ik wil is dat hierbij een public variabele wordt toegevoegd tijdens runtime zodat de class er daarna als volgt uit ziet:
code:
1
2
3
4
5
6
7
class a
{
   public string newVar; //Nieuw toegevoegde variabele via reflection????
   public void dummyMethod()
   {
   }
}

Of is dit op een andere manier te realiseren.

  • Vedett.
  • Registratie: November 2005
  • Laatst online: 21:39
Ik denk niet dat dit mogelijk is. Je kan dynamisch IL code genereren met System.Reflection.Emit, maar een JIT-gecompileerde class aanpassen gaat denk ik niet lukken.

Maar wat wil je uiteindelijk bereiken? Want ik vermoed dat er wel een andere oplossing is voor je probleem.

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Is mogelijk, maar niet via reflection (=spiegel). Je kunt namelijk dynamisch assemblies compileren. Daarvoor bestaat de Microsoft.CSharp.Compiler class. Voor .net 2.0 en hoger is de CSharpCodeProvider class (in dezelfde namespace) dan benodigd (Compiler is obsolete). De commandline compilers maken gebruik van dezelfde classes.

Als je je basic class waarin je de variabele wilt toevoegen niet sealed of internal markeert, dan kan je nieuwe class deze overriden. Voorbeelden van hoe dit werkt zijn bij de betreffende compiler classes te vinden.

Onze systemen genereren tal van 'dynamische' assemblies om business rules naar native code om te zetten. Wel raad ik je aan ook op een productie omgeving deze assemblies met debug symbols te compileren. Als er dan een fout optreed, kan heb je een nuttigere stacktrace.

Een eenvoudigere oplossing is het gebruik van een dictionary class waar je de extra 'variabelen' in kwijt kan.

If it isn't broken, fix it until it is..


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Dit heet dynamic proxy, en het is mogelijk, maar je hebt er niet zoveel aan. Dynamic proxy is in feite het creeeren van een subtype van de class en daarin de nieuwe properties/fields in stoppen en die returnen. Het punt is alleen: die nieuwe elements kun je niet gebruiken in je code, want die zitten er niet in at compiletime. Je kunt ze alleen gebruiken in grids bv dmv reflection.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik vraag me idd af waarom je dat zou willen? Ik kan me wel een aantal scenario's bedenken maar mischien wil je wel iets doen wat je op een veel betere manier kunt doen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”