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

    [VB.NET]Funzione generica per instanziare classi

    Devo creare una funzione generica che mi istanzi una classe che gli passo, cioè una cosa del genere:

    codice:
    Private Sub Apri(ByVal parametro1 as string, ByVal NomeClasseDaIstanziare As Object)
    
        End Sub
    e poi la vorrei richiamare così
    codice:
    Apri("prova", ClsParametrizzazione)
    e poi nella funzione Apri ci sarà una cosa del genere:
    codice:
    Dim cls As New NomeClasseDaIstanziare
    Cosa dovrei mettere al posto di Object?
    solo che non so come posso gestire, qualche idea?

  2. #2
    codice:
    Public Function InstantiateClass(ByVal parameter As String, ByVal objType As System.Type) As Object
        Dim types(0) As Type
        types(0) = GetType(System.String)
        Dim info As ConstructorInfo = objType.GetConstructor(types)
        Dim targetObject As Object = info.Invoke(New Object() {parameter})
        If targetObject Is Nothing Then
            Throw New ArgumentException("Can't instantiate type")
        End If
        Return targetObject
    End Function
    Va richiamata così:
    codice:
        Dim obj As Object
        obj = InstantiateClass("asdsasdas", GetType(nomeClasse))
    .
    Ma a questo punto non è più semplice fare semplicemente
    codice:
        Dim obj As New nomeclasse("asdasdasd")
    ?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Ogni volta che istanzio una classe inserisco un suo riferimento in una collection(salvando nella collection il riferimento alla classe e un id univoco). Quando tento di istanziare una seconda istanza della classe mi vado a verificare prima se è già stata istanziata verificando nella collection la presenza dell'id univoco, e, se è già presente mi faccio restituire una valore, altrimenti istanzio la classe(il tutto in una ventina di righe di codice).
    Così, invece di scrivere queste venti righe di codice pensavo di creare una funzione alla quale gli passo il nome della classe e che va a controllare se è già stata istanziata o meno...
    non so se ho reso l'idea.
    Comunque ho preso spunto dal tuo codice ed è venuto fuori questo:

    codice:
    Public Sub InstanziaClasse(ByVal ClassName As String)
        Dim objType As System.Type
            objType = Type.GetType(ClassName)
    
            Dim objParams() As System.Type = {}
    
            Dim objConstructor As Reflection.ConstructorInfo = objType.GetConstructor(objParams)
    
            If objConstructor Is Nothing Then
                Throw New Exception("Costruttore non trovato per la classe " & objType.FullName)
            Else
          ...
    
     End If
     End Function
    Suggerimenti?

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.