2010-03-07 18 views
6

Ho cercato una risposta e trovato alcuni C# -examples, ma non poteva ottenere questo correre in vb.net:Creare una nuova istanza di un tipo passato come parametro

ho pensato a qualcosa di simile al seguente:

public function f(ByVal t as System.Type) 
    dim obj as t 
    dim a(2) as t 

    obj = new t 
    obj.someProperty = 1 
    a(0) = obj 

    obj = new t 
    obj.someProperty = 2 
    a(1) = obj 

    return a 
End Function 

lo so, posso creare una nuova istanza con l'Activator.Create ... metodi, ma come creare una matrice di questo tipo o semplicemente dichiarare una nuova variabile? (dim)

Grazie in anticipo!

risposta

14

Dipende molto dal tipo stesso. Se il tipo è un tipo di riferimento e ha un costruttore vuoto (un costruttore che accetta zero argomenti), il seguente codice dovrebbe creare un insance di esso: utilizzano farmaci generici:

Public Function f(Of T)() As T 
    Dim tmp As T = GetType(T).GetConstructor(New System.Type() {}).Invoke(New Object() {}) 
    Return tmp 
End Function 

Utilizzo di un parametro di tipo:

Public Function f(ByVal t As System.Type) As Object 
    Return t.GetConstructor(New System.Type() {}).Invoke(New Object() {}) 
End Function 
+0

@ M.A. La risposta di Hanin è ottima, usa sicuramente la versione generica se puoi. Invece di .Invoke (New Object()) Penso che sia necessario utilizzare .Invoke (Nothing). Inoltre, tutto ciò ha detto, il 99% delle volte che vedo qualcuno fare questo lo stanno facendo per il motivo sbagliato o stanno facendo qualcosa in modo davvero molto difficile. La riflessione è utile in una manciata di situazioni, ma il più delle volte rende il tuo codice molto più confuso. –

+0

Questa risposta è esattamente ciò di cui avevo bisogno! Sto ancora cercando di ottenere http://stackoverflow.com/questions/2386690/method-to-override-shared-members-in-child-classes/2387070 funzionante, quindi questa sembra essere una soluzione. – stex

+0

@Stex, felice di poterti aiutare. Riguardo a quell'altra domanda, ho proposto un'altra soluzione, ma ora vedo che potrebbe essere irrilevante. @Chris Haas, grazie per il tuo commento. Penso che tu abbia ragione su quei 99% - lavorare con Generics e Reflection sembra troppo lucrativo, anche se molte volte risulta essere un overkill/overcomplexation. –

16

Personalmente mi piace molto questa sintassi.

Public Class Test(Of T As {New}) 
    Public Shared Function GetInstance() As T 
     Return New T 
    End Function 
End Class 

Oppure, se si desidera limitare i possibili tipi:

Public Class Test(Of T As {New, MyObjectBase}) 
    Public Shared Function GetInstance() As T 
     Return New T 
    End Function 
End Class 
+0

Sì, è molto meglio –

Problemi correlati