[VB.Net] Functies en modules zoeken aan de hand van string

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Moi_in_actie
  • Registratie: Maart 2007
  • Laatst online: 16:07
Hallo mensen,

Ik heb een tijd geleden een stukje code geschreven die aan de hand van een string value een methode kan opzoeken en deze uitvoeren. Dit ongeveer als volgt:

Dim [property] As MethodInfo = GetType(classX).GetMethod(_name)
[property].Invoke(Me, myparamarray)

Dit alles werkt prima. Nu wil ik het echter nog een extra stap zetten bij een ander project, waar ik niet alleen de functie/methode zo opzoek, maar waar ook nog de class, of in dit geval de module, waarin die methode zit en deze kan variëren. Ik heb een aantal modules gemaakt, elk in een aparte vb-file met daarin de functie horende bij een bepaald programma onderdeel. Probleem is alleen dat ik dus niet meer het stuk "GetType(classX).GetMethod(_name)" kan gebruiken. Dit ten eerste omdat "classX" niet vast staat, maar nu ook variabel is. Verder is het ook geen class, maar een module, dus kan ik de handel niet instantiëren. In dat geval zou ik het object nog kunnen achterhalen via de Activator.CreateInstance() methode.

Ik heb al een hele reeks dingen geprobeerd om aan de hand van een string de module te vinden, of de specifieke functie/methode direct te vinden binnen de Assembly, alleen helaas zonder resultaat.
Bestaat er een manier om, in ongeveer de stijl van het eerste stukje code, direct de methode te zoeken/aanroepen binnen alle modules van dit VS-project? Of anders, mocht het voorgaande niet mogelijk zijn, de module te zoeken aan de hand van een stringvalue en daarop de GetMethod() toe te passen?

Bvd.

Ryzen 9 9950X3D ~~ 32GB GSkill TridentZ 6000Mhz ~~ ASRock B850M Steel Legend ~~ Powercolor Hellhound RX9070XT


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Even los van je probleem: ik vermoed dat je even een stapje terug moet doen en eerst eens even moet aangeven wat je precies probeert te bereiken een niveautje hoger.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Moi_in_actie
  • Registratie: Maart 2007
  • Laatst online: 16:07
"Kort" samengevat gaat het als volgt: ik heb een aantal usercontrols (noem ze voor het gemak even pagina's) die in het begin leeg zijn. De content wordt helemaal gegeneerd aan de hand van custom controls die ik zelf geschreven heb. Die controls laden ook UI content in, zoals panels, groupboxen, listviews, buttons.. zo'n beetje alles wat je kunt bedenken. Deze custom controls zijn naar mijn inziens redelijk "advanced" aangezien ze ook met elkaar kunnen interacten (resizing, openen/sluiten, vinden automatisch de juiste plaats op het scherm, weten wat elkaars parent/children zijn etc.).

Aangezien alle content at runtime gegenereerd wordt, moeten ook events gekoppeld worden. Ook dit is allemaal al prima geregeld. Nu is het zo dat de "pagina's" heel simpel toegevoegd en de hele UI gebouwd kan worden met een paar regels code. Dit alles is het UI gedeelte van het project.

De achterliggende logica/code heb ik afgesplitst in een ander VS-project. Om deze 2 delen zo te maken dat niet de een meteen vastloopt als de ander wordt aangepast, ben ik een controller class (ook weer in een apart VS-project) aan het het maken. Hierin zit een module die je vanuit de UI kunt aanspreken, waarbij je aan de hand van een generieke aanroep functies kunt aanroepen. Dit bijvoorbeeld met parameters als de Content, een string afgeleid uit een tag die verwijst naar een functie en verder nog een aantal veiligheidsparameters.
Deze module kan naderhand de inhoud van de content controleren, kijken of de aanroeper toegang heeft en zoekt aan de hand van de aanroeper + tag de juiste functie.

Mijn probleem zit hem bij dit laatste. De functie is deels af te leiden van de tag, waarbij ik (zoals boven beschreven) bij een eerder project de GetMethod(stringname) gebruikte om dat uit te voeren. Nu zitten al deze functies in verschillende modules en niet in dezelfde class en zijn het geen classes maar modules. Ik zoek in het beste geval iets in de trend van:
GetType(de_module).GetMethod(de_methode)
Zowel de methode als de module moet ik hierbij zoeken aan de hand van een string value. Methodes zoeken (binnen een class) lukt prima, echter de module niet.

Ryzen 9 9950X3D ~~ 32GB GSkill TridentZ 6000Mhz ~~ ASRock B850M Steel Legend ~~ Powercolor Hellhound RX9070XT


Acties:
  • 0 Henk 'm!

  • Moi_in_actie
  • Registratie: Maart 2007
  • Laatst online: 16:07
Iemand enig idee OF het überhaupt mogelijk is een methode/functie te zoeken binnen verschillende modules in VB.Net?

Ryzen 9 9950X3D ~~ 32GB GSkill TridentZ 6000Mhz ~~ ASRock B850M Steel Legend ~~ Powercolor Hellhound RX9070XT


Acties:
  • 0 Henk 'm!

  • TallManNL
  • Registratie: Oktober 2005
  • Laatst online: 08-09 11:05
Je zult met reflection waarschijnlijk wel kunnen wat jij wilt.

geheelonthouder met geheugenverlies


Acties:
  • 0 Henk 'm!

  • Moi_in_actie
  • Registratie: Maart 2007
  • Laatst online: 16:07
Ik gebruikte al reflection voor het opzoeken van methodes, alleen ging dat niet als ik modules moest zoeken. De oplossing is echter inmiddels boven water. Om de module, en het type ervan, te vinden is het vereist om niet puur te zoeken op de stringnaam van de module (bv. "modCalc"), maar naar de volledige assembly/projectnaam + module naam (bv. "MyProject.Code.Modules." & "modCalc"). Dit geeft uiteindelijk een code als:

Dim t As Type = Type.GetType("MyProject.Code.Modules." & modName)
Dim [property] As MethodInfo = t.GetMethod(functionName)
[property].Invoke(t, myparamarray)

Dit had ik schijnbaar over het hoofd gezien, alhoewel het wel enigszins logisch is. Echter toen ik eerder probeerde een overzicht op te vragen van alle modules in de assembly, kreeg ik er 0 geretourneerd. Daarom dacht ik dat ik niet daar moest gaan zoeken naar de modulenaam.

Ryzen 9 9950X3D ~~ 32GB GSkill TridentZ 6000Mhz ~~ ASRock B850M Steel Legend ~~ Powercolor Hellhound RX9070XT

Pagina: 1