Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [VB.Net] Richiamare SUB tramite Stringa

    Ciao a tutti, da giorni sto provando a cercare e testare diverse soluzioni per riuscire a richiamare delle sub tramite una stringa contenente semplicemente il nome della sub, ho cercato e trovato diverse soluzioni sia usando la CallByName sia passando per la Reflection, ma nessuna soluzione funziona, vi riporto come esempio le soluzioni usate ed i relativi problemi.

    Soluzione tramite CallByName:
    codice:
    Dim objArgs As Object = Nothing 
    Dim mdlRef As String 
    mdlRef = "Mdl_" & strSubName
    objArgs = CreateObject(mdlRef) 
    CallByName(mdlRef, strSubName, CallType.Method)
    In questa soluzione ho provato ad usare diversi riferimenti nella prima parte della CallByName mettendo come primo parametro il progetto,la come corrente, il nome della sub, il nome del modulo che la contiene, ho poi provato a cercare di creare un oggetto da poter passare partendo dla nome del modulo che lo contiene sia con la CreateObject che con la GetObject (essendo che dovrebbe già esistere...) ma in tutti i casi dice che il componente ActiveX non può creare l'oggetto (ho anche provato a dichiarare il modulo come classe pubblica e aggiungere l'istanza new ma anche in questo caso né create né get object funzionavano).

    Soluzione tramite reflections:
    codice:
    Dim MioAmbito As Type = Me.GetType() 
    'Dim asmAssembly As Reflection.Assembly = Reflection.Assembly.GetExecutingAssembly 'Test per passare da assembly anziché da MioAmbito 
    Dim miMetodo As System.Reflection.MethodInfo = MioAmbito.GetMethod(strSubName) 
    Dim objArgs As Object = Nothing 
    If McrsParam = "" Then 
      objArgs = Nothing 
    Else 
      objArgs = StrParam 
    End If 
    If IsNothing(objArgs) Then 
      miMetodo.Invoke(Me, Nothing) 
    Else 
      miMetodo.Invoke(Me, objArgs) 
    End If
    Anche qui ho fatto diversi test ma miMetodo rimane sempre a nothing, ho provato sia passando in strSubName il nome della sub sia il nome del modulo o della classe che lo contiene ma sempre invano, idem i test usando assembly anzichè direttamente la Type...

    Spero qualcuno abbia avuto più fortuna di me e sappia come fare quest'oprazione all'apparenza semplice

    Grazie

  2. #2
    Utente di HTML.it L'avatar di yyzyyz
    Registrato dal
    Oct 2001
    Messaggi
    1,653
    Ciao non so se possa esserti di aiuto cmq ti mando un esempio (tips), puoi avviarlo creando una console application ed incollando il codice sottostante.
    codice:
    Module Module1
    
        Sub Main()
            Dim miasub As String
            Dim parametro As String
    
            Console.WriteLine("scrivi sub (uno o due):")
            miasub = Console.ReadLine()
            Console.WriteLine("scrivi parametro:")
            parametro = Console.ReadLine()
    
            chiamasub(miasub, parametro)
            Console.ReadKey()
        End Sub
        Sub chiamasub(ByVal nomesub As String, ByVal param As String)
            Dim myobj As New classi
            Dim mytype As System.Type = GetType(classi)
            Dim myInfo As System.Reflection.MethodInfo = mytype.GetMethod(nomesub)
            Dim myParameters() As Object = {param}
            myInfo.Invoke(myobj, myParameters)
        End Sub
        Public Class classi
            Sub uno(ByVal n As String)
                Console.WriteLine("valore parametro" & n)
            End Sub
            Sub due(ByVal n As String)
                Console.WriteLine("valore parametro" & n)
            End Sub
        End Class
    End Module

  3. #3
    purtroppo non sarebbe fattibile in questo modo, al di là del fatto che moduli,classi e funzioni dove magari richiamo l'invoke sono distinti in parti diverse, quindi non tutto nello stesso modulo, un altro punto è che alla GetType non potrei passare, ad es, una variabile contenente il nome del modulo o della classe contenente le sub da richiamare...

  4. #4
    piccolo aggiornamento: ho riscontrato che passando alla GetType il modulo contenente la sub poi il discorso funziona...rimane il problema che il modulo non è fisso ma posso al limite intercettarlo tramite una stringa con il nome, e quindi si torna al problema di intercettare un componente del progetto tramite stringa, magari sono fortunato e sulla GetType qualcuno sa come farlo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.