[C#] Run-time define type

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • sorted.bits
  • Registratie: Januari 2000
  • Laatst online: 21-06 22:28
Ik ben op dit moment bezig met een klein tooltje, maar daar loop ik tegen een probleem aan.

Ik wil runtime de type van een variabele bepalen.

Voorbeeld :
code:
1
2
string StructureName = "Test";
Type theType = Type.GetType("WMITool.Structures." + StructureName);
De structure is ergens anders al in elkaar gesleuteld. Nu wil ik een variabele definieren als dit type, en liever zelfs als een een array van dit type. Ik heb geprobeerd een variabele object aan te maken, waarna ik een GetMembers heb uitgevoerd.

Mijn object krijgt dan wel de juiste members (die van de bovenstaande structure), maar ik kan hier eigenlijk geen array van maken.

Ik wil dus eigenlijk een functie maken, welke een string aangeleverd krijgt (de naam van een structure), binnen deze functie moet een Array gemaakt worden van een X aantal variabelen, met het type van die structure.

Weet iemand of dit kan ?

Edit :
Ter verduidelijking, dit is wat ik wil, maar dan is dus de structure name niet tijdens design-time bekend :
code:
1
2
Object[] testObject = new Object[25];
testObject[0] = new Structures.win32_networkadapter();

[ Voor 15% gewijzigd door sorted.bits op 12-03-2005 12:50 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:24
code:
1
Activator.CreateInstance()

:?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • sorted.bits
  • Registratie: Januari 2000
  • Laatst online: 21-06 22:28
whoami schreef op zaterdag 12 maart 2005 @ 13:13:
code:
1
Activator.CreateInstance()

:?
momentje, te snel op verstuur.

[ Voor 35% gewijzigd door sorted.bits op 13-03-2005 08:08 ]


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Hier heb je niets aan. Je wilt at runtime een type maken en daar een instance van maken, maar je kunt geen code schrijven die die properties / methods aanspreekt, want at compiletime kent de compiler het type niet. Ook kun je geen array maken van een type at runtime. Een array wordt gemaakt at compile time door de compiler.

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


Acties:
  • 0 Henk 'm!

Anoniem: 90394

ga eens rondneuzen in de Reflection klassen
of zie
MSDN voor ArrayList.toArray(Type)
EfBe schreef op zondag 13 maart 2005 @ 11:32:
Ook kun je geen array maken van een type at runtime. Een array wordt gemaakt at compile time door de compiler.
Nonsense, anders zou je ook geen nieuw object met een array als private variabele kunnen maken in je progjes, want die zou dan al compile-time aanwezig moeten zijn en dat kan niet omdat de compiler niet weet hoeveel objecten en dus array's er gemaakt gaan worden.
(niet om te flamen, maar efBe, als je MVP bent hoor je dit te weten, en tuurlijk kan je runtime onbekende klassen en methoden aanroepen die de compiler van je progje nog nooit heeft gezien, zie de hele .NET reflection namespace, handig is anders, maar het kan zeker wel)

[ Voor 84% gewijzigd door Anoniem: 90394 op 13-03-2005 14:00 ]


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Anoniem: 90394 schreef op zondag 13 maart 2005 @ 13:08:
ga eens rondneuzen in de Reflection klassen
of zie
MSDN voor ArrayList.toArray(Type)
[...]
Nonsense, anders zou je ook geen nieuw object met een array als private variabele kunnen maken in je progjes, want die zou dan al compile-time aanwezig moeten zijn en dat kan niet omdat de compiler niet weet hoeveel objecten en dus array's er gemaakt gaan worden.
Nee ik bedoel dit:

myType[] foo = MakeArray();

en dan met foo verder programmeren. Je kunt dit niet dynamisch doen, want je hebt het type 'myType' nodig. Je kunt hooguit: object[] foo = Makearray(); doen, maar dan is foo een array van het type object.

Je kunt dus nooit type specific properties aanroepen van myType in dat geval. dat wil TS en dat kan niet.

Verder is System.Array een abstract class en at runtime bouwt de IL gegenereerd door de compiler het array voor dat type.

bv als jij doet:
private void Foo(int amount)
{
int[]bar = new int[amount];
// ...
}

dan maakt de compiler code aan die dat array aanmaakt van het type int. Is ook verder niet zo belangrijk, waar het om gaat is dat je het array TYPED wilt gebruiken. Hoe wil je anders de properties van de elements gaan gebruiken? _daar_ gaat het om, dat kan niet in dit geval.
(niet om te flamen, maar efBe, als je MVP bent hoor je dit te weten, en tuurlijk kan je runtime onbekende klassen en methoden aanroepen die de compiler van je progje nog nooit heeft gezien, zie de hele .NET reflection namespace, handig is anders, maar het kan zeker wel)
Zucht.

Wat denk je dat ik dat allemaal niet weet? Ik bedoelde dat hij het array verder typed wil gebruiken: dus theArray[index].SomeProperty, dat _KAN NIET_, je moet dan terugvallen op MethodInfo troep inderdaad, maar dat lijkt me een onnozele weg in dit kader.

je kunt prima object arrays maken en dan daar die objects instoppen (of structs in dit geval). Je kunt GEEN typed properties aanroepen van elements in dat array, want dat type is niet bekend at compile time, ook kun je geen typed array aanmaken at runtime en dat dan dus at compile time verder gebruiken, je MOET in dat geval iig een interface hebben waarmee je het type van de array elements kunt opgeven zodat je typed de properties kunt aanroepen.

In VB.NET vziw zit wel een soort late binding, mits option strict off staat. In C# niet. Je moet t.a.t. het type at compile time paraat hebben anders kun je het array niet gebruiken (jaja, property descriptors ophalen, invoken etc. kom niet aan met dat ik dat niet weet... :( ).

En als MVP 'behoor' ik helemaal niet 'iets' te weten. Ik probeer alleen maar te helpen, maar kennelijk is dat helpen voor iemand die erkenning voor zn activiteiten voor de community een hachelijke zaak aan het worden want die titel wordt klaarblijkelijk gezien als een diploma voor het halen van een of ander examen. Ik kan je verzekeren, antwoorden zoals de jouwe doen mij echt afvragen waarom ik in fuckingvredesnaam tijd steek in het helpen van mensen. Ik heb nl. helemaal geen zin in dit soort gezeik, moet ik me weer verdedigen, aantonen dat ik het wel weet etc. etc. Jaja, ik weet niet iets van reflection en type generation at runtime... Nee, echt iets waar je op zit te wachten wanneer je in je spaarzame vrije tijd iemand probeert te helpen.

[ Voor 25% gewijzigd door EfBe op 13-03-2005 15:03 ]

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


Acties:
  • 0 Henk 'm!

  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 18-06 09:04

D4Skunk

Kind of Blue

Wat je evt. wel kan doen, maar met een serieuze performance hit, is het maken van een custom propertydescriptor voor je klasse; je gaat als het ware dynamisch properties gaan aanmaken voor je klasse.
Dit is echter niet echt aan te raden; de enige reden die ik kan bedenken, en waarvoor ik het zelf ook gebruik, is het voor het editten van een class instance in een propertygrid.
Voor programmatie kan je deze zaken sowieso niet gebruiken, gezien dit enkel @ runtime je klasse kan modificeren.

offtopic:
@efbe : wat is eigenlijk een mvp ? moet je daar een opleiding voor volgen, krijg je daar een opleiding voor, heb je een concreet takenpakket ?

[ Voor 15% gewijzigd door D4Skunk op 14-03-2005 14:17 ]


Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
D4Skunk schreef op maandag 14 maart 2005 @ 14:15:
offtopic:
@efbe : wat is eigenlijk een mvp ? moet je daar een opleiding voor volgen, krijg je daar een opleiding voor, heb je een concreet takenpakket ?
offtopic:
De titel 'MVP' geeft Microsoft aan mensen die zich in hun ogen zeer verdienstelijk hebben gemaakt voor de community. Een soort award zeg maar. Die wordt jaarlijks uitgereikt, er zijn er zo'n 2500 over de gehele wereld in allerlei diciplines. Het betekent niet dat wanneer je je tomeloos inzet je die award ook krijgt: als je chronisch foute antwoorden geeft bv, probeer je wel heel hard maar help je eigenlijk niet echt. Dus het is wel zo dat wanneer je zo'n award krijgt je kennelijk geen onzin hebt geblaat het afgelopen jaar. MVP's krijgen van Microsoft extra's: gratis MSDN universal, allerlei evenementen mag je gratis heen, en je krijgt inside info. Ook zijn de lijntjes naar de teams van jouw categorie erg kort.

Om het jaar erop weer die award te krijgen, moet je wel doorgaan met je inzetten voor de community. Anders wordt je niet geprolongeerd. Ze checken dit wel intensief. Dat houd je wel scherp en wanneer je je wilt blijven inzetten voor de community, moet je wel behulpzaam kunnen zijn, dus moet je veel kennis bijspijkeren (maar dat is veelal toch al het geval). Ik wil niet de conclusie trekken noch opdringen dat MVP's de creme de la creme is, maar dat ze veelal wel weten waarover ze praten is inherent aan de award, anders krijg je hem niet. Maar we maken wel fouten hoor. MVP's corrigeren elkaar regelmatig en daar is niets mis mee.

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


Acties:
  • 0 Henk 'm!

  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 18-06 09:04

D4Skunk

Kind of Blue

offtopic:
@efbe
Hmmz.. klinkt interessant ;)
Ik veronderstel dat je moet voorgedragen worden door andere MVP's ?
Bedankt voor de uitleg, ik zal wel ff zoeken op het net...

Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
D4Skunk schreef op maandag 14 maart 2005 @ 17:30:
offtopic:
@efbe
Hmmz.. klinkt interessant ;)
Ik veronderstel dat je moet voorgedragen worden door andere MVP's ?
Bedankt voor de uitleg, ik zal wel ff zoeken op het net...

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

Pagina: 1